상거래용 형태소 분석기 및 구문분석기 개발 에 관한 연구 :: 개발참고자료[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

개발참고자료
[1]
등록일:2008-04-07 13:12:06 (0%)
작성자:
제목:상거래용 형태소 분석기 및 구문분석기 개발 에 관한 연구

최 종 연 구 보 고 서


상거래용 형태소 분석기 및 구문분석기 개발 에 관한 연구

수탁기관 한 성 대 학 교


한 국 전 자 통 신 연 구 원

제 출 문

한국전자통신연구원장 귀하

본 보고서를 상거래용 형태소 분석기 및 구문분석기 개발 에 관한 연구의 최종연구보고서로 제출합니다.

1999년 2월 27일

수 탁 기 관 : 한성대학교

수탁 기관장 : 이성근 (인)

연구 책임자 : 강승식

참여 연구원 : 윤보현, 류수연


요 약 문

1. 제 목

상거래용 형태소 분석기 및 구문분석기 개발

2. 연구의 목적 및 중요성

1) 연구의 목적

한국어 형태소 분석은 한국어 정보처리 분야의 필수적인 요소로서 범용 한국어 형태소 라이브러리가 개발되어 인터넷 정보검색 시스템이나 한-영, 한-일 기계번역 시스템 등에 적합한 형태로 수정되어 활용되고 있다. 그러나 상거래용 키워드 추출 및 자연어 질의문 에서는 다양한 유형의 가격 표기 방식에 대하여 이를 표준화하는 기능이 주된 요소가 되므로 이를 그대로 활용하기가 어렵다. 전자 거래에서 필요로 하는 이러한 특성을 고려할 때 기존 한국어 분석 라이브러리의 수정 및 확장이 불가피하다.

전자거래에서 가격 어절의 처리는 아라비아 숫자로 '2356'을 '2,356', '이천삼백오십육', '2천3백5십6' 등과 같이 여러 가지 유형이 가능하다 따라서 숫자와 한글이 혼용된 경우에 이를 표준화하여 아라비아 숫자로 변환시켜 주어야 한다. 그런데 수사와 숫자가 혼용된 경우에는 '이천 삼백 오십 육', '이천삼백 오십육', '2천 3백 5십 6', '2천3백 5십6'과 같이 띄어쓰기가 자유롭기 때문에 이웃한 어절들이 하나의 숫자를 의미할 때는 띄어쓰기 문제를 처리할 수 있어야 한다.

따라서 가격을 표현하는 방법을 제약하지 않고 아라비아 숫자 혹은 한글로 표기하거나 아라비아 숫자와 한글을 병행하여 표기한 것을 자동으로 인식하여 표준화해 주는 숫자 인식 모듈이 필수적이며, 이는 상거래용 한국어 분석 기술의 핵심적인 요소 중의 하나이다.

기존의 범용 한국어 형태소 및 구문 분석 라이브러리를 활용하더라도 상거래용 응용 프로그램에 적합하도록 가격 지정 연산자 및 숫자 인식 오토마타의 개발이 필수적이다. 전자거래 시스템에서 가격과 관련된 색인어를 자동으로 추출할 수 있게 하고, 자연언어 질의문을 지원할 수 있도록 가격지정 연산자를 인식하는 방법을 고안하는 것이 본 연구의 목적이다.

2) 연구의 중요성

가격을 표현하는 방법의 다양성과 함께 전자거래에서 중요한 요소 중의 하나는 사용자 인터페이스 문제이다. 일반적으로 인터넷 검색에서는 핵심적인 단어를 입력함으로써 관련 정보를 검색하는 방법을 사용한다. 그런데 전자거래에서 상품을 구매할 때는 상품명과 더불어 가격을 입력해야 한다. 따라서 가격을 입력하는 다양한 방식을 자동으로 처리 할 수 있어야 하고, 또한 상품 구매 시에는 '1000원 이상 2000원 이하'와 같이 '이상/이하/미만'등 가격지정 연산자를 인식할 수 있어야 한다.

기존 형태소 분석을 이용한 자동색인 시스템은 가격을 표시하는 단어뿐만 아니라 가격지정 연산자를 불용어로 처리하여 색인을 하지 않고 있으며, 이러한 기능을 갖추는 형태소 분석기를 개발할 필요가 있다. 특히, 전자거래를 위한 사용자 인터페이스는 가격연산자 처리를 포함한 자연언어 질의어가 가장 적합하며, 이를 위해서는 한국어 구문분석기를 개발하여야 한다.

자연언어 처리에서 한국어 구문분석기를 개발하는 연구가 있으나 이는 범용 한국어 문장들을 대상으로 하고 있기 때문에 정확률이 매우 낮다. 따라서 이러한 구문분석기를 활용하더라도 전자거래용 가격지정 연산자를 인식할 수 있도록 개선되어야 한다. 그런데 상품 구매를 위한 전자거래에서 사용되는 문장의 유형들은 비교적 정형화되어 있으므로 이러한 문장유형들을 인식하는 구문분석기를 개발함으로써 사용자들이 편리하게 전자거래 시스템을 사용할 수 있도록 하는 것이 바람직하다.

3. 연구의 내용 및 범위

범용 한국어 분석 라이브러리는 일반적인 언어 현상들을 처리하는데 기능이 중요시되고 있어서 상거래용 정보자료를 처리할 때는 가격 어절을 인식하는 문제와 가격지정 연산자를 인식하는 기능은 처리되지 못하고 있다. 가격을 의미하는 다양한 표현 방법들은 형태소 분석과 연계된 부분이며, 가격지정 연산자를 인식하고 이를 최대값, 최소값으로 변환하는 문제는 형태소 분석 기능을 확장하여 구문 분석 기술과 밀접한 관련이 있다.

가격어절 표준화 문제와 가격지정 연산자를 인식하여 사용자가 원하는 가격대의 상품정보를 제공하는 특수 목적의 형태소 분석기와 구문분석기를 개발하려면 많은 노력이 필요하다. 본 연구에서는 전자거래 시스템에서 요구되는 문제점을 가장 효율적으로 해결하는 방법으로 기존의 한국어 분석 라이브러리를 활용한다.

한국어 분석 라이브러리를 전자거래에서 요구되는 기능에 적합하도록 기능을 보완하고 이와 더불어 전자거래에서 중요시되는 기능들을 추가함으로써 형태소 분석기와 구문분석기를 확장하여 전자거래 시스템에 적합한 형태로 구성한다. 본 연구에서 다루고 있는 연구 내용과 범위는 아래와 같다.

- 한국어 분석 라이브러리 활용 방안 검토

- 전자거래 시스템에서 사용되는 문장 유형 분석

- 한글과 숫자가 혼합된 가격 지정어 인식 및 변환

- 가격지정 연산자 유형 분석

- 상거래용 자연언어 질의어 처리기의 설계 및 구현

4. 연구결과

가격지정 어절을 인식하고 표준형으로 변환하는 시스템과 전자거래를 위한 자연언어 질의어 처리 시스템을 설계하고 이를 구현하였다. 가격지정 어절을 인식하기 위하여 가격지정 어절을 인식하기 위하여 가격지정 어절을 나타내는 다양한 방법을 조사하였다. 특히, 가격 어절의 띄어쓰기 문제를 고려하여 이를 아라비아 숫자로 변환하는 시스템을 설계하고 구현하였다. 가격지정 어절 변환 시스템은 기존의 한국어 형태소 분석기와 연계하여 전자거래용 문서를 색인하는데 활용할 수 있도록 하였다.

가격지정어가 포함된 질의 문장을 처리하는 자연언어 질의어 처리 시스템을 구현하기 위하여 가격지정 연산자를 수집하고, 가격지정 연산자가 포함된 문장의 구조를 분석하였다. 질의 문장들의 유형에 따라 자연언어 질의어로부터 상품명과 가격대를 인식하는 시스템을 구현하였다.

자연언어는 매우 다양한 유형들이 존재하기 때문에 자연언어 질의어에서도 모든 유형들을 미리 파악하고 처리하기는 어렵다. 따라서 기존의 전자거래 인터페이스를 자연언어 질의어로 대체하려면 많은 실험을 통해서 성능을 개선하여야 한다. 그러나 전자거래에 사용되는 문장들의 유형은 비교적 단순하기 때문에 이에 관한 연구가 계속될 경우 수년 내에 실용화 수준에 이를 것으로 판단된다.

한국어 구문분석기는 그 활용 분야가 매우 많고 파급 효과가 매우 크지만, 실용 가능한 수준의 정확도를 얻기가 어렵기 때문에 현재까지 한국어 구문분석기는 응용 소프트웨어에서 실제로 활용된 적이 거의 없다. 본 연구를 통하여 현재의 구문분석 수준에서도 전자거래용 질의문과 같이 문장 유형이 비교적 정형화된 일부 응용 시스템에서 실제로 활용될 수 있음을 확인하였다.

5. 활용에 대한 건의

본 연구의 결과로 개발된 가격어절 표준화 모듈은 전자거래용 자동색인뿐만 아니라 날자와 시간 등 아라비아 숫자와 한글이 혼용되는 모든 경우에 활용될 수 있다. 또한 일반적인 자동색인 시스템에서도 이를 도입하여 숫자와 관련된 어절을 불용어로 처리하는 방법으로 활용이 가능하다.

이와 더불어 구문분석을 이용한 자연언어 질의어를 처리하는 사용자 인터페이스는 실제로 활용하기에는 부족하지만 활용 가능성을 확인하였다. 기존의 방법과 자연언어 질의어 방식을 병행하여 실제 시스템에 도입하고 문제점을 보완함으로써 기존의 방식을 대치할 수 있다고 판단된다.

자연언어 질의어 처리 시스템의 성능을 좀더 개선하면서 시범적으로 이를 전자거래 시스템에서 도입하여 일정 기간 동안 성능을 보선하는 과정을 거친다면 저자거래 시스템에 대한 사용자 편의성을 개선하는데 획기적인 역할을 할 수 있을 것으로 기대된다.

6. 기대 효과

전자거래용 문서에서 기존의 형태소 분석기를 사용함으로써 발생되고 있던 가격 어절 문제를 해결함으로써 전자거래 시스템을 사용하는 사용자들에게 사용자 편의성을 개선하는 효과가 있을 것으로 판단된다.

가격어절 표준화 문제는 자연언어 질의문을 처리할 때 필수적인 요소로서 기존의 인터페이스를 자연언어 질의문으로 대치하는 기술을 구현하는데도 매우 유용하게 사용된다. 이 기술을 기반으로 자연언어 질의문 처리 시스템이 상용화되면 전자거래 시스템의 사용자 편의성 높아지게 되므로 더 많은 사용자들이 편리하게 전자거래 시스템을 활용할 수 있을 것이다.

전자 상거래라는 제한적인 범위 내에서 자연언어 질의문을 처리하는데 구문분석 기술이 활용될 수 있음을 확인하였다. 한국어 정보처리 기술의 측면에서 구문분석 기술이 실제로 응용 시스템에서 활용할 수 있다는 가능성을 확인함으로써 전자거래와 유사한 응용 분야에서 구문분석 기술을 활용하는데 시발점이 되었고, 이를 기반으로 범위가 좀더 넓은 응용 분야들에서도 구문분석 기술을 활용할 수 있는 토대를 마련하는데 기여할 것이다.


Abstract

There are various forms of number representation method in the Korean language though it's general form is an Arabic number. It is caused by the mixture of Arabic numbers and Korean numerals such as '2천3백5십6'. Especially word-spacing problem makes it hard to solve the problem.

We implemented an automata to solve the number-numeral mixture problem and converted the various forms of numerals to a standard form. It module is indispensible to the Electronic Commerce system and it was appended to the Korean morphological analyzer. It is very useful to recognize numerals and to get a standard form.

Natural language query (NLQ) is very useful to the beginners fro the Electronic Commerce system and it will expand the use of the software. We tried to recognize a product name at the natural language query sentence and to get a minimum-maximum prices in it. We analyzed the syntax of numerals and numeral operators.

We also designed and implemented a natural language query processor for Electronic Commerce system. At first, we collected price-operators that is used for the representation of the range of prices. And then, we analyzed the syntax patterns of them. The recognition of product names is based on the price-operators occurred in noun phrase. If a product name is fund, minimum price and maximum price are extracted from the noun phrase.

Korean parser is indispensible for almost all the Korean language processing system, but the quality of the parse was not sufficient for them. As a result of this research, we found that Korean parser can be applied to the commercial system like domain-specific natural language query processor.


목 차

제 1 장 서론

제 1 절 한국어 분석기술 현황

제 2 절 전자거래를 위한 한국어 분석

제 2 장 한국어 분석 라이브러리 고찰

제 1 절 색인어 추출 과정

제 2 절 형태소 분석과 색인어 추출

제 3 장 전자거래용 한국어 형태소 분석기

제 1 절 형태소 분석기 요구사항

1. 일반적인 요구 사항

2. 가격 어절의 색인 문제

제 2 절 형태소 분석기의 구조

제 3 절 형태소 분석 입력-출력 구조

제 4 절 한글-숫자 혼용어 분석

1. 숫자와 수사의 표현 방법

2. 수사 어절 인식 알고리즘

3. 수사 어절 변환 알고리즘

4. 띄어쓴 수사 어절 결합 방법

제 4 장 자연언어 질의어 처리기

제 1 절 질의어 처리기 요구사항

1. 가격지정 연산자

2. 부울리언 질의문

제 2 절 질의어 처리기의 출력 구조

제 3 절 질의어 처리기의 설계

1. 질의어 처리기의 구조

2. 구문분석 결과의 출력 구조체

제 4 절 질의어 처리기 구현

1. 질의어 처리기의 구조

2. 가격지정 연산자

3. 질의어 분석 및 결과 생성

제 5 장 결론

참 고 문 헌

부록-1, HAM 라이브러리의 단어 유형

부록-2. HAM 라이브러리의 품사 유형

부록-3. 수사 어절 인식 Source(일부)

부록-4. 수사 어절 변환 Source(일부)

부록-5. 전자거래용 질의어 처리기 Source(일부)

부록-6. 수사 어절의 유형 예

부록-7. 전자거래용 질의어 문장 예

부록-8. 질의어 처리기 실행 예


그림 목차

그림 2.1 색인어 추출 과정

그림 2.2 색인어 저장 구조

그림 2.3 형태소 분석 결과의 저장 구조

그림 3.1 전자거래용 색인어 추출 과정

그림 3.2 자동색인 결과의 출력 구조

그림 3.3 수사 어절 판단을 위한 변수 정의

그림 3.4 수사 어절 인식 알고리즘

그림 3.5 수사 어절 변환 알고리즘-1

그림 3.6 수사 어절 변환 알고리즘-2

그림 4.1 질의어 처리 결과의 출력 결과의 출력 구조

그림 4.2 전자거래용 질의어 처리기 구조도

그림 4.3 구문분석 결과 구조체: 지배-의존 관계

그림 4.4 구문분석 결과 구조체: head-daughter 관계

그림 4.5 자연언어 질의어 처리과정

그림 4.6 질의어 분석결과 구조체

그림 4.7 질의어 처리 알고리즘

그림 4.8 가격 연산자 유형 정의


표 목차

표 4.1 가격지정 연산자 유형

제 1 장 서 론

제 1 절 한국어 분석기술 현황

정보화 사회에서 자연언어 처리는 매우 중요한 부분을 차지하고 있으며 이러한 시대적 흐름으로 인하여 한국어 정보 처리에 대한 관심이 고조되고 있다.

최근에 와서는 특히 기술 선진국들의 소프트웨어 개방 압력 등으로 국내 소프트웨어 산업이 발전하기 위해서는 독자적인 기술을 가지고 있어야만 하는 상황도 작용하고 있다. 그런데 한글 입-출력을 제외한 한국어 분석 및 생성과 관련된 기술이 취약했던 문제점으로 인하여 구문 분석기의 개발을 비롯하여 실용적인 응용 소프트웨어에서 활용하려고 할 때 여러 가지 문제점들이 있었다.

영어 등 타국어 처리에 비해 한국어 정보처리 기술이 뒤쳐진 이유는 한국어를 컴퓨터로 처리할 때 발생하는 문제점에 대한 분석이 충분치 못한 점과 형태소 분석이나 구문분석기를 구현할 때 필요한 한국어의 다양한 특성에 관한 연구가 미흡했던 점도 있다. 또한, 다양한 언어 현상을 발견하는데 필수적인 말뭉치의 구축이 보편화되지 못한 요인도 있다. 특히, 한국어를 컴퓨터로 처리하는 기반 기술에 대한 연구가 체계적으로 이루어지지 못했던 것이 가장 큰 이유라고 할 수 있다.

기계 번역을 비롯하여 한국어 이해 시스템, 한글 인터페이스 등의 자연언어 처리 분야에서 공통적으로 필요한 기술은 한국어 분석에 관한 것이다. 자연언어 분석은 형태소 분석과 구문분석, 그리고 의미분석으로 이루어지는데 그 중에서도 가장 기초가 되는 부분은 형태소 분석이다. 영어의 경우 형태소 분석은 99% 이상의 분석률로 거의 완벽한 수준에 도달하였고, 이를 이용하여 자동 색인(automatic indexing)이나 문서 편집기에서 철자 검사(spelling check)기능, 문자 인식 시스템의 후처리 기능과 같이 여러 가지 응용 소프트웨어 분야에서 활용되고 있다. 다른 언어들에 대해서도 현재 형태소 분석과 구문분석에 관하여 많은 연구 진행되고 있다.

한국어 형태소 분석 기술이 발전함에 따라 맞춤법 검사 및 교정기가 실용화 되었고, 인터넷 정보검색 시스템에서 형태소 분석을 이용한 자동색인(automatic indexing) 기능이 실용화되어 있기도 하다. 또한, 한-일, 한-영 등 기계 번역 시스템에서도 한국어 문장의 분석을 위해 형태소 분석기가 사용되고 있다. 그런데 영어에 비해서 한국어 형태소 분석은 언어의 특정상 기능어에 의하여 단어의 역할이 결정되기 때문에 구문론적 특성이 형태론적 특성과 결합되어 나타난다. 한국어 구문분석은 아직 시제품 단계로서 범용 구문분석 기능을 수행하는데 어려움이 많으나 문서의 키워드 추출 등 응용 분야별로 활용 가능성 매우 높은 상태이다.

한국어 형태소 분석 기술은 최근 10여년 동안 지속적인 연구개발의 결과로 실용화 단계로 발전하였으며, 계속해서 이를 응용 소프트웨어에 적합한 형태로 활용하는 기술이 연구되고 있다. 영어와 일본어 등 외국어의 경우에는 수년 전에 이미 형태소 분석 활용 기술이 확보되어 있으나, 국내에서는 최근에 와서야 형태소 분석을 이용한 응용 시스템의 요구가 확대되고 있다. 구문분석은 한국어의 경우에 아직 시제품 수준인데 비해 영어와 일본어 등 선진 외국어는 응용 분야에 따라 활용되기 시작하고 있는 단계이다.

한국어 형태소 분석 및 구문분석은 외국 기업이나 연구소에서 개발하기 어려운 특성이 있으며, 국내에서 개발된 분석기를 사용해야 한다. 현재, 한국어 분석 시스템의 응용 확대와 이후의 급속한 변화를 고려할 때 기계번역 시스템 등 외국어에서도 한국어 정보처리 시스템을 개발하여 역수입 가능성도 있다. 특히, 한국어 정보처리 기술은 단시일 내에 활용되기 어렵고 다년간에 걸쳐 기술이 발전되고 있으므로 기존의 한국어 분석 라이브러리를 적극 활용하여 응용 분야에 적합하게 수정하여 사용할 수 있는 기술을 확보하는 것이 바람직하다.

이처럼 한국어 형태소 분석 및 구문분석 기술은 한국어 정보처리 기능이 요구되는 모든 응용 분야의 핵심적인 모듈로서 이를 각 응용 소프트웨어에서 그 목적에 적합하게 수정하고 기능을 추가할 수 있는 실용적인 기술이 필수적이다. 이러한 기술 개발을 시발점으로 연관된 기반 기술을 구축한다는 측면에서 필수적인 과제라고 할 수 있다. 특히 연구된 기술 및 개발된 제품이 국내에 널리 보급되는 경우 이를 기반으로 점차 유사 기능으로 확장하거나 관련 응용 기술에의 확대를 기대할 수 있다.

제 2 절 전자거래를 위한 한국어 분석

한국어 형태소 분석기는 맞춤법 검사와 정보검색 시스템의 자동색인 등 일부 응용 시스템에서 활용되고 잇다. 그러나 미등록어와 복합명사를 처리하는 문제, 날짜, 시간, 가격 등 숫자와 관련된 용어를 인식하는 문제 등 응용 소프트웨어의 요구 사항에 따라 개선되거나 추가되어야 할 기능들이 있다. 이러한 기능들은 한국어 형태소 분석에 관한 연구가 일반적인 형태소 분석 문제들을 우선적으로 해결하는데 중점을 두었기 때문에 간과하고 있던 부분이다.

이러한 형태소 분석기의 부가 기능들은 일반적인 응용 분야에서는 중요치 않지만 특정 응용 분야에서는 매우 중요한 경우도 있다. 전자거래 시스템의 경우에는 상품 가격을 인식하는 기능이 핵심 요소이므로 아라비아 숫자와 수사가 결합된 어절을 인식할 수 있도록 형태소 분석기를 보완해야 한다.

구문분석 기술은 영어의 경우에 자동색인이나 문법검사(grammar checking), 주제어 추출(keyword extraction), 문서 요약(document abstraction) 등 일부 응용 분야에서 제한적으로 활용되고 있다. 그 이유는 구문분석기의 분석 정확도가 높지 않기 때문이다. 오랜 기간 동안 개발되어 왔기 때문에 비교적 안정적인 영어 구문분석기의 경우에도 정확도는 60%∼80%라고 알려져 있다. 따라서 높은 정확도가 요구되는 응용 분야에서는 구문분석기를 사용하기가 어렵다.

그러나 정형화된 유형의 문장들이나 구문분석 결과에 오류가 포함되어 있더라도 한국어 정보처리 기능에 영향이 심각하지 않은 분야에서 활용될 수 있다. 전자거래를 위한 자연언어 질의어에서는 상품명과 가격을 인식하는 기능이므로 구문분석기를 이용한 한국어 문장의 처리가 가능하다. 물론, 제한적인 분야에서도 한국어 한국어 형태소 분석이나 구문분석 기능은 완벽할 수는 없기 때문에 지속적으로 성능을 개선하는 유지-보수가 필요하다.

한국어 형태소 분석 및 구문분석은 전자거래 시스템의 실용화를 위하여 필수적인 부분으로서 한국어 구문분석 기능을 활용할 수 있는 응용 분야 중의 하나이다. 특히, 전자거래를 위한 구문분석 기능은 특수 기능만을 지원하는 형태소 분석기의 보조 기능으로 사용되지만, 장기적으로 볼 때 구문분석 기술이 아래와 같이 다양한 응용 분야에서 실용적으로 활용할 수 있도록 발전하는데 그 시발점이 될 것으로 생각된다.

· 인터넷 정보검색 시스템 자연언어 인터페이스

· 차세대 인간과 컴퓨터 인터페이스 기술

· 한-일, 한-영 기계 번역 시스템

· 한국어 이해 시스템 및 국어 교육 시스템

· 기타 한국어 정보처리 응용 시스템

제 2 장 한국어 분석 라이브러리 고찰

전자거래를 위한 형태소 분석과 구문분석기를 처음부터 설계하여 구현하는 일은 많은 비용과 시간이 필요하므로 기개발된 한국어 분석 라이브러리를 활용하는 것이 바람직하다. 그런데 한국어 분석 라이브러리는 일반적인 한국어 분석 기능을 제공하고 있으므로 가격지정 연산 등 전자거래용 질의문을 분석하기 위해 특수 목적으로 필요한 한국어 분석 기능들이 제대로 지원되지 못하고 있다. 따라서 범용 한국어 분석 라이브러리의 기능을 최대한 활용하고 이 라이브러리에서 제공되지 못하는 기능들을 추가-보완하는 방법을 취하는 것이 바람직하다.

기존의 형태소 분석 기술이나 구문분석 기술을 응용하고 이를 확장하여 전자거래에 한국어 분석 기능을 보완하기 전에 범용 한국어 분석 라이브러리를 활용하는 방법으로 한국어 분석 라이브러리의 입-출력 환경 등 제반 사항들을 검토할 필요가 있다.

특히, 범용 한국어 분석 라이브러리는 한글 어절을 중심으로 분석 결과를 생성하고 있으며, 미등록어를 추정할 때 오류가 발생하는 경우도 있다. 특히, '100만'이라는 어절과 같이

(1)

(2)

2가지 이상의 분석결과가 존재하고 문맥에 틀린 경우에는 옳은 분석결과를 선택해 주어야 한다. 또한, 전자거래용 형태소 분석에서는 '2백만원' '3십5만원대' 등 한글과 숫자가 혼용되거나 '삼백 오십원', '3백 5십원'과 같이 띄어쓴 것도 허용된다. 이러한 어절들에 대해 미등록어 추정 오류가 발생하지 않도록 하고. 띄어쓴 어절에서 숫자를 인식하려면 형태소 분석 라이브러리에서 관련된 부분을 수정하거나 기능을 추가하여야 한다.

제 1 절 색인어 추출 과정

일반적으로 정보검색 시스템에서 어떤 정보자료에 출현한 색인어를 추출하는 과정은 그림 2.1과 같다. 그림 2.1에서 '형태소 분석' 단계에서는 입력어절을 구성하고 있는 형태소들을 분리한다. 분석결과가 다수인 경우에는 우선순위를 부여하여 가능성이 높은 것 순서로 정렬해 준다. 미등록어의 경우에는 조사/어미가 분리되어 가장 적합한 분석 후보들을 생성한다.

그림 2.1 색인어 추출 과정

'색인 후보어 추출' 단계에서는 형태소 분석결과를 이용하여 색인어(index term)가 될 수 있는 어휘들을 추출한다. 일반적으로 명사들이 색인어로서 가치가 높으며, 따라서 대부분의 정보검색 시스템들은 명사만을 추출하는 역할을 한다.

'불용어 제거' 단계는 추출된 색인 후보어들로부터 색인어로서 가치가 없는 용어들을 제거해 주는 역할을 한다. 불용어를 제거하는 방법으로는 관형사, 부사. 감탄사와 같이 특정 품사에 해당하는 용어들을 모두 불용어로 간주하는 방법과 불용어 사전에 수록된 용어들을 불용어로 간주하는 방법이 사용되고 있다.

이 때, 영문자 스트링이나 'LG인터넷,과 같이 영문자와 한글, 한글과 영문자가 혼합된 것은 색인어로 간주한다. 또한, '1999년', '2월', '12시30분'과 같이 숫자 스트링이나 숫자와 한글이 혼합된 용어는 대부분 불용어가 된다. 그러나 '윈도95', '3-1절' 등 특수한 경우에 색인되어야 하는 것도 있다. 따라서 예외적인 용어들은 특수색인어로 간주하여 색인어로 추출되도록 한다.

색인어로 추출된 것들 중에는 '정보검색시스템'과 같이 복합명사가 다수 포함될 수 있다. 복합명사를 정보자료에 출현한 형태로만 색인을 하게 되면 '정보'나 '검색', '시스템'에 검색했을 때 검색되지 못하는 일이 발생하므로

'정보검색 시스템' '정보', '검색', '시스템'

으로 분해하여 각 단위명사들을 색인해 주어야 한다. 대부분의 정보검색시스템에서 자동으로 복합명사를 분해하여 복합명사와 함께 각 단위명사들을 색인하는 방법을 사용하고 있다. 마찬가지로 4음절(혹은 3음정) 이상의 미등록어에 대해서도 단위명사를 추출하여 색인하게 된다.

현재, 국내 정보검색 시스템에서 동사와 형용사는 품사 불용어로 간주하여 색인을 하지 않고 있다. 그러나 인터넷 정보검색 시스템에서는 검색된 결과가 매우 많아서 검색된 문서의 수를 줄이는 효과적인 방안의 하나로서 동사와 형용사를 색인할 필요가 있다. 특히, 의류 정보 시스템이나 멀티미디어 정보검색에서 이미지를 검색할 때는 '노란 장미'라든지 '눈물을 흘리는 장면' 등 용언이 색인어로서 중요한 역할을 하기도 한다. 따라서 색인어로서 가치가 있는지, 없는지는 정보검색 대상 자료의 성격에 따라 결정할 수 있도록 해야 한다.

제 2 절 형태소 분석과 색인어 추출

전자거래용 형태소 분석에서 사용되는 분석결과는 색인된 정보자료로부터 질의문에 의해 정보를 검색하는데 필요한 용어들이다. 이에 비추어 불 때 한국어 분석 라이브러리에서 추출된 각 색인어는 용어가 출현한 위치정보와 색인어 유형 정보를 가지고 있어야 하므로 그림 2.2와 같은 구조로 되어 있다.

typedef struct keyword_str {

HAM_UCHAR wid; /* word-id: 0-255 */

HAM_UCHAR tag; /* type of keyword */

HAM_PUCHAR key; /* ptr. to keyword */

}HAM_KEYSTR, *HAM_PKEYSTR;

그림 2.2 색인어 저장 구조

이 구조체에서 'wid'는 색인어가 추출된 어절의 식별자로서 문장내에서 그 어절이 몇 번째 어절인가를 나타내는 정수이다. 'tag'는 색인어의 유형을 구분하기 위한 것으로 색인어의 유형을 구분하기 위한 tag의 종류로는 아래와 같은 것들이 사용된다.

MARK_NOUN

:사전에 수록된 명사

<주의> 1 음절 명사는 MARK_1SYL_NOUN이다.

MARK_1SYL_NOUN

:사전에 수록된 명사 중에서 1음절 명사

<주의> 영문이나 숫자가 'A','4'와 같이 1문자로 된 것을 포함한다.

MARK_CNOUN

: 복합명사로 각 단위명사들이 사전에 수록된 명사인 경우

<주의> 복합명사를 구성하는 요소들 중 하나라도 형태소 분석 사정에 수록되지 않은 것은 MARK_UNKNOWN이다.

MARK_UNKNOWN

: 형태소 분석기가 명사로 추정한 미등록어

MARK_NOUN_CMP

: 복합명사 분해에 의해 복합명사나 미등록어를 구성하고 있는 component로 분리된 용어.

MARK_SPECIAL

: 특수색인어로 'hangul,top'에 수록된 용어

MARK_ABC

: English, vitamin-A, CD-ROM, LG-EDS 등 아스키 문자

<주의> 'A', 'B'와 같이 1문자로 된 것은 MARK_1SYL임

MARK_HANGUL_ABC

: 한글과 영문자가 복합된 색인어 것

: 2문자이상_영문자+2음절이상_한글 --- 텔레콤, LG 정보통신, CNN뉴스

: 2음절이상_한글+alphanum : 삼성SDS, 비타민A, 한겨레21, 윈도95

MARK_123

: 0-9까지 숫자로 시작되는 것

: 1st, 2nd, 123,12.34, 3개, 5원, 10만원, 21세기, 98년, 3월, 6시, 30분, 24회 등

<주의> '1', '2'와 같이 1문자로 된 것은 MARK_1SYL임

MARK_ALPHANUM

: 기타 한글과 영문이 혼합된 것

: 알파벳_1문자 + 한글 : 그룹, B회사 등

: 1음절_한글 + alphanumeric : 제3(의), 제5회 등

일반적으로 자동색인 시스템에서는 주로 문서의 내용을 대표하는 명사들이 중요시되지만 숫자와 관련된 용어들은 중요치 않으므로 무시하게 된다. 따라서 날짜와 가격 등 숫자가 포함된 용어는 추출되지 않는다. 즉, 기존의 한국어 분석 라이브러리는 전자거래용 자동색인에서 중요시되는 가격에 관한 용어가 색인되지 않는 문제이다.

가격에 대한 용어를 색인어로 추출하려면 숫자가 포함된 단어의 유형과 품사를 분석하여 색인어로 추출해 주어야 한다. 형태소 분석결과로부터 가격에 관한 용어를 인식하려면 형태소 분석결과 혹은 입력 문장에서 가격 용어를 인식하는 방법이 있다. 그런데 HAM 라이브러리에는 형태소 분석결과에 대한 저장구조에서 어휘형태소들의 품사 유형과 함께 영문자, 숫자가 포함되어 있는 어휘들을 구별해 주고 있으므로 이 정보를 활용하는 것도 가능하다.

가격에 관한 용어를 인식하기 위해 기존의 HAM 라이브러리에서 사용하고 있는 형태소 분석 결과의 출력 구조를 검토해야 한다. HAM의 형태소 분석 결과에 대한 저장 구조를 그림 2.3과 같으며, 이 출력구조에서 사용되고 있는 한국어 단어 유형과 품사 유형은 각각 부록 1, 부록 2와 같다.

typedef struct ham_result { /* 형태소 분석 결과 */

HAM_SHORT score; /* score of this result */

HAM_UCHAR patn; /* word pattern */

HAM_UCHAR type; /* type of input word */

HAM_UCHAR stem[STEMSIZE]; /* stem of input word */

HAM_UCHAR pos; /* 3 simplified stem type */

HAM_UCHAR pos2; /* pos attr. for 'pos' */

HAM_UCHAR dinf; /* POS info. in han-dic */

HAM_UCHAR nsfx; /* index of noun suffix

HAM_UCHAR vsfx; /* index of verb suffix */

HAM_UCHAR josa[JOSASIZE]; /* Josa string */

HAM_PUCHAR jlist; /* unit-Josa sequence */

HAM_UCHAR eomi[EOMISIZE]; /* Eomi string */

AHM_PUCHAR elist; /* unit-Eomi sequence */

HAM_UCHAR pomi; /* encoded prefinal Eomi */

HAM_UCHAR xverb[XVERBSIZ]; /* xverb string */

/* morphological attributes*/

HAM_UCHAR vtype; /* irregular verb type */

struct jomi_variant jomi; /* Josa/Eomi variant info. */

} HAM_RESULT, HAM_FAR *HAM_PRESULT;

그림 2.3 형태소 분석 결과의 저장 구조

제 3장 전자거래용 한국어 형태소 분석기

제 1절 형태소 분석기 요구사항

1. 일반적인 요구 사항

전자거래용 형태소 분석에서 발생하는 문제로는 정보자료를 색인할 때 발생하는 일반적인 문제와 전자거래라는 특수성으로 인해 발생하는 개별적인 문제로 구분된다. 일반적인 문제의 예로는

"나는 TV를 사고 싶어요"

에서 'TV'를 색인하는 문제와

"10~20%의 유전자 정보가 미해독 상태라서라나요."

에서 '상태라서라나요'와 같이 드물게 사용되는 용어를 처리하는 것 등이다. 'TV라는 용어가 색인되지 않는 경우는 한글 1음절어를 색인하지 않고 불용어로 간주함으로써 발생할 수 있다. 이 문제는 불용어 처리 모듈에서 2-byte 영어는 불용어로 간주하지 않도록 함으로써 해결된다.

'상태라서라나요'와 같이 드물게 사용되는 용어는 형태소 분석기가 처리하지 못한 단어 유형인 경우에 발생하며, 형태소 분석기는 새로운 유형의 단어들을 처리할 수 있도록 개선되고 있으므로 전자거래용 분석기와 분관하게 처리 될 수 있다. 하지만, '-(이)라서나나요'를 조사/어미 사전에 수록하기 전에 이것이 문법적으로 옳은지, 그렇지 않은지를 판단하여 그 결과에 따라 처리되어야 한다.

이외에도 전자거래용 자동색인에서 발생하는 색인 오류에는 고유명사에 관한 것들이 있을 수 있다. 전자거래에서는 제품을 판매하는 회사의 이름이 색인되어야 하는데 회사 이름은 그 형태가 매우 다양하다. 외래어와 유사한 음절들로 구성되거나 영문 첫글자들로 이루어진 경우도 많기 때문이다. 특히, '한글과 컴퓨터'처럼 조사/어미가 포함된 경우에 띄어쓰게 되면 이를 인식하기가 매우 어렵다.

제품을 소개하는 정보자료는 주로 색인어(명사)들로 나열되므로 자동색인 과정을 거치지 않고 모든 문자열을 색인하면 되지만, 자연언어 질의문은 문장으로 구성되기 때문에 자동색인 과정을 거쳐야 한다. 이 때, 회사 이름이 질의문에 포함되면 자동색인 오류가 발생할 수 있다.

2. 가격 어절의 색인 문제

전자거래 분야의 특수성 때문에 발생하는 형태소 분석 오류는 주로 아라비아 숫자나 수사가 포함된 어절이다. 형태소 분석에서 수사 처리 문제는 한글 문서에서 숫자의 표현 방법이 다양하기 때문에 발생하고 있다.

전자거래에서 질의어에 의해 검색되는 용어에는 가격에 관한 어절이 다수를 차지한다. 그 예로 "1백만원 TV를 사고 싶어요." 대한 질의문에 대해 가격이 '백만원'인 TV에 대한 정보를 검색한다. 이런 유형의 정보검색이 가능하려면 일반적인 자동색인에서 불용어로 간주되는 숫자가 포함된 용어를 색인어로 추출해야 한다. 그런데 이 때 가격 지정어는 동일한 의미에 대해 아래 예와 같이 여러 가지 형태로 표현된다.

① 230000원

② 230,000원

③ 이십삼만원

④ 이십 삼만원

⑤ 2십3만원

⑥ 2십 3만원

이와 같이 아라비아 숫자로 표기되거나 한글로 표현된 것, 띄어쓰기를 한 것과 그렇지 않은 것 등을 모두 통일된 형태로 변환하여 색인하여야 한다. 이 때 자동색인 시스템은 숫자가 포함된 어절과 수사가 포함된 어절을 대상으로 가격을 의미하는 어절인지를 확인하여야 한다. 왜냐하면 숫자나 수사가 포함된 어절 중에는 날짜와 시간 등 가격 어절이 아닌 경우도 다수 발생하기 때문이다.

어떤 어절이 가격 어절로 인식되면 가격 어절의 띄어쓰기를 고려하여 표준형으로 변환한다. 가격 어절의 표준형은 편의상 아라비아 숫자로 된 스트링으로 한다. 이때 두 어절 이상으로 분할된 어절은 형태소 분석 결과 참조하여 하나로 통합해 주는 과정이 필요하다.

3. 인용부호로 둘러싸인 복합어

자동색인 시스템이 추출하는 색인어는 기본적으로 조사/어미 등 기능어가 제거되기 때문에 '한글과 컴퓨터'사, '바람과 함께 사라지다'와 같은 2음절 이상의 고유명사라든지 '21세기를 진단한다.', '국화 옆에서' 등의 제목은 조사/어미가 탈라된 용어만 색인이 되므로, 때로는 색인어가 전혀 추출되지 않는 경우도 발생할 수 있다.

고유명사나 문서 제목의 표지(marker)가 있는 정형화된 문서는 이를 색인하는 것이 가능하지만 그렇지 않은 것은 색인 오류 문제가 발생할 수 있다. 자연언어 질의문에서도

"한글과 컴퓨터"사의 고객지원센터를 알고 싶어요

의 예와 같이 동일한 현상이 발생한다. 그런데 자연언어 질의문에서 이러한 유형의 고유명사를 인식할 수 없기 때문에 인용부호로 구분하도록 제한한다. 따라서 질의문에서는 아래와 같이 구문 형태의 고유명사를 인용부호로 표시를 하고 이를 색인어로 추출한다.

제 2절 형태소 분석기의 구조

기존의 범용 형태소 분석 라이브러리를 이용하여 전자거래용 한국어 형태소 분석기를 구현할 때 전체적인 구조는 그림 3.1과 같다. 형태소 분석을 하기 전에 가격 어절을 인식하는 목적은 '2백 3십원'과 같이 띄어쓴 가격 어절을 하나로 통합하기 위한 것이다.

전처리 과정으로 두 어절 이상으로 분리되어 있는 가격 어절을 한 어절로 통합하는 것이 가격 어절을 표준형으로 변환할 때 효율적이다. 두 어절 이상으로 분리된 가격 어절의 인식은 수사와 숫자로 구성되는 숫자를 인식하는 오토마타에 의해 가능하다.

색인어 후보들이 생성되면 가격 어절을 표준형인 아라비아 숫자 스트링으로 변환한다. 이 기능은 숫자로만 구성된 어절과 한글로만 구성된 어절과 한글로만 구성된 어절, 그리고 숫자와 한글이 혼합된 어절을 모두 표준형으로 변환함으로써 불용어 처리 과정에서 대표어로 색인하거나 혹은 불용어로 간주하기 편리하도록 한 것이다.

전자거래를 위한 가격어절의 인식은 가격어절 표준형(아라비아 숫자 스트링) 뒤에 '원/달러/엔/파운드'와 같이 가격을 의미하는 의존명사가 결합된 경우와 숫자로만 끝나는 경우이다. 즉, '시/분/초/년/월/일' 등 가격과 전혀 관계없는 지정어가 나타나는 경우는 불용어로 간주해도 될 것이다.

그림 3.1 전자거래용 색인어 추출 과정

제 3 절 형태소 분석 입-출력 구조

일반적인 자동색인의 경우 분석 대상이 어절 단위이므로 입력을 '어절'로 하고, 출력은 그 어절에 포함된 색인어 리스트이다. 즉, 색인어가 될 수 없으면 출력은 null이 되고, 단일명사는 색인어가 1개지만, 복합명사는 그 자체로서 색인어가 될 수 있을 뿐만 아니라 복합명사를 분해하여 각 단위명사들이 색인어가 되므로 한 어절에 대하여 2개 이상의 색인어가 가능하다.

전자거래용 자동색인에서도 정보자료를 색인할 때는 일반적인 자동색인과 동일한 입-출력 구조가 적용되지만, 자연언어 질의어를 분석하려면 문장 단위로 분석해야 한다. 따라서 정보자료의 색인과 질의문 분석의 입-출력 구조를 동일하게 하기 위해 입력을 '문장' 단위로 하고, 출력은 색인어 리스트가 되도록 출력구조를 그림 3.2와 같이 정의한다.

#define NOUN_LENGTH 256

struct Noun_ List{

char noun{NOUN_LENGTH};

struct Noun_List *link;

};

그림 3.2 자동색인 결과의 출력 구조

그림 3.2의 구조체 Noun_List는 정보자료의 색인 결과를 반환하는 함수의 색인어 리스트로서 색인어 유형이나 위치정보 등 색인어에 대한 정보는 고려하지 않았다.

제 4 절 한글-숫자 혼용어 분석

1. 숫자와 수사의 표현 방법

문서에서 숫자를 표현하는 방법은 아라비아 숫자로만 표현한 경우, 한글로 만 표현한 경우, 그리고 두 가지 유형의 문자가 혼합된 경우가 있다. 또한, 이 유형들에서 띄어쓰기 오류가 포함되어 있는 경우도 있다.

2350000원, 2,350,000원, 235만원, 2백35만원, 이백삼십오만원, 2백 35만원, 2백 3십5만원, 2백3십 5만원, 이백 삼십오만원, 이백삼십오 만원, 이백 삼십 오만원

이러한 유형들을 검색할 때 서로 일치시키기 위하여 아라비아 숫자 스트링으로만 이루어진 대표형으로 변환하여야 한다. 숫자 변환의 편의성을 위하여 다양한 유형의 수사 어절을 어절의 중간에 공백이 있는 것과 공백이 없는 것으로 구분한다. 왜냐하면 형태소 분석에서 공백을 어절을 분리하는 단위로 사용되어 다른 어절로 인식하게 되며, 이 경우에는 두 어절 이상에 걸쳐 있는 숫자를 하나로 통합하는 문제가 발생하기 때문이다.

유형-A : 공백이 없는 유형

① 23500000

② 23,500,000

③ 2350만원

④ 2,350만원

⑤ 2천3백50만원

⑥ 2천3백5십만원

⑦ 이천삼백오십만원

유형-B : 공백이 삽입된 유형

① 2천 3백 5십만원

② 2천 3백 50만원

③ 2천3백 5십만원

④ 2천5백3십7억 2천3백5십만원

⑤ 이천삼백 오십칠만원

⑥ 이천 삼백 오십 칠만원

자주 사용되는 유형-A와 유형-B을 우선적으로 처리한다. 유형-C는 숫자표기 오류이므로 유형-A와 유형-B에서 자동으로 처리될 수 있는 유형들에 대해서만 아라비아 숫자로 변환한다. 유형-B에서 자동으로 처리될 수 있는 유형들에 대해서만 아라비아 숫자로 변환한다. 유형-A의 '23,000,000원'과 '2,350만원'의 처리는 comma를 삭제하는 전처리가 필요하다.comma의 삭제는 천 단위인 경우에만 삭제하고 comma 위치가 잘못된 것은 오류어로 간주한다.

유형-C : 띄어쓰기-맞춤법 오류 유형

① 2백 삼십오만원

② 2백 3십오만원

③ 2백삼십 5만원

④ 이백 삼십 5만원

⑤ 이백 삼십5만원

⑥ 이백3십오 만원

⑦ 이백 3십 5만원

유형-A와 유형-B는 모두 한글과 아라비아 숫자가 혼용된 경우가 존재하므로 숫자를 인식하는 알고리즘을 공유하는 방법과 독립적인 처리 방법이 모두 가능하다. 다만, 처리 방법을 단순화하고 정확한 분석을 위하여 유형-B의 경우에는 입력문장의 전처리 과정에서 띄어쓴 어절들을 한 어절로 결합하는 방식을 취한다.

2. 수사 어절 인식 알고리즘

유형-A의 수사 어절을 아라비아 숫자 스트링으로 변환하는 알고리즘은 입력 어절 어절인지를 판단하는 알고리즘과 수사 어절을 아라비아 숫자 스트링으로 변환하는 알고리즘으로 구현된다. 입력 어절이 수사 어절인지, 아닌지를 판단하기 위해서 그림 3.3과 같은 변수들을 이용한다.

int s1=1000; /* '천' '백' '십' 기다림 */

int s2=1000; /* '조' '억' '만' 기다림 */

int aflag=0; /* '1'∼'9' 발견? */

int hflag=0; /* '일'∼'구' 발견? */

int acount=0; /* '1'∼'9' 개수 */

int hcount=0; /* '일'∼'구' 개수 */

그림 3.3 수사 어절 판단을 위한 변수 정의

변수 s1은 다음 음절로서 '천/백/십'이 출현한 순서를 제어하기 위한 것이다. 즉, '2천3백5십'은 옳지만, '3백2천5십'은 틀린 어절이므로 이 순서를 제어하기 위한 용도로 사용된다. 초기값 1000은 '삼억오천육백칠십팔만', '삼억육백칠십팔만', '삼억칠십팔만', '삼억팔만'과 같이 '천', '백', '십' 등 1000보다 작은 음절 중 하나가 올 수 있음을 의미한다. '천' 단위가 처리되면 s1=100으로 값을 바꿔 주고, 이것은 '백/십'이 올 수 있음을 뜻한다. 만일, s1=1000인 경우에 '천' 단위가 없이 '백' 단위가 오면 s1=10으로 값을 바꿔 준다.

변수 s2의 용도는 s1과 유사하다. 즉, '조/억/만'이 출현한 순서를 제어하기 위한 것이다. 즉, '조/억/만'의 순서는 옳지만 '만/조/억' 순서는 틀린 어절이므로 이 순서를 제어하기 위한 용도로 사용된다. 초기값으로 1000이 주어진 의미는 '조/억/만' 중에서 아무거나 올 수 있음을 의미하고, 100은 억과 '만' 중에서 하나가 올 수 있음을 의미한다.

변수 aflag와 hflag은 각각 '1'∼'9', '일'∼'구'에 대하여 이미 숫자 하나가 발견되었는지, 그렇지 않은지를 표시한다. 이 변수의 용도는 '육칠백'이나 '67백'과 같이 숫자 단위어 앞에 1개의 숫자만 오도록 제한하고 이 제약을 위반하여 오류어로 간주하기 위한 것이다.

acount와 hcount는 각각 입력 어절에 출현한 '1'∼'9', '일∼'구'까지의 숫자 개수를 저장한다. 이 변수들은 정확하게 수사 어절로 판단되지는 않았지만, 수사 어절일 가능성이 높은 어절을 인식하기 위한 것이다.

그림 3.4의 알고리즘은 입력 어절이 수사 어절인지, 아닌지를 판단하는 알고리즘으로 반환값은 '순수한 수사 어절', '가격에 관한 수사가 발견된 어절', '수사 어절로 추정되는 것', '수사 어절이 아닌 것' 중 하나이다. 이 알고리즘에서 인자 'word'는 한글인 경우에 2바이트씩 음절 단위로, 아스키 문자는 1바이트씩 증가한다고 가정한다(부록-3 참조)

수사 어절을 인식할 때 아래 어절들은 일반적인 명사로 사용되는 경우가 많고 수사로 사용되는 경우는 드물기 때문에 예외로 간주한다.

백사, 천사, 만사, 조사, 영원, 일원, 이원, 삼원, 사원, 구원

또한 아래 용어들은 '원'과 같이 가격 연산자가 없는 것은 수사로 인식하지 않는다.

일조, 이조, 사조, 육조, 구조, 이만, 오만, 팔만

Algorithm is_num_string(char *word)

{

while (*word) {

if (*word == '천/백/십')

변수 s1의 값을 조절;

else if (*word == '조/억/만')

변수 s2의 값을 조절;

else if (*word == '1/2/.../9' or '일/이/..../구')

변수 aflag, hflag의 값을 조절;

else if (*word == '원/달러/엔/...')

return 2; /* 숫자 뒤에 가격수사 어절 */

else if (*word == '\0') /* 모든 음절 처리완료 */

return 1; /* 아라비아 숫자 스트링! */

else {

if(숫자어절 추정) return 3;

else return 0; /* 숫자어절 아님! */

}

word++; /* 다음 음절 또는 숫자 */

}

}

그림 3.4 수사 어절 인식 알고리즘

3. 수사 어절 변환 알고리즘

아라비아 숫자와 수사가 혼용된 문자열을 아라비아 숫자 문자열 변환하는 함수 num_conv()를 구현하는 위해서 숫자를 한글로 표기하는 규칙을 이용한다. 즉, 영어에서는 단위로 끊어서 수사로 표기하는데 비해, 한글에서는 단위로 끊어서 표기하고 있다.

Algorithm numeral2number(char *str)

{

char *n1=str, *n2;

while(*n1) {

if (*n1 == '1/2/..../9')

*n2++ = *n1++;

else if (*n1 == '일/이/..../구')

*n2++ = conv2aradic(*n1++);

else if (is_10unit(*n1) /* '십/백/천/만/억/조' */

*n2++ - *n1++;

else if (*n1 ==',')

;

else break; /* error */

}

conv_numeral_unit(n2, str);

}

그림 3.5 수사 어절 변환 알고리즘- 1

(예1) "3천4백5십63천4백5십63천4백5십6"

(예2) "삼천사백오십육삼천사백오십육삼천사백오십육"

(예1)과 (예2)는 '만' '억'을 기준으로 '천/백/십' 단위 수사가 나타난다. 한글과 숫자가 혼합된 유형은 먼저 단위인 '조/억/만'을 기준점으로 '천/백/십'으로 구성된 10단위 문자열이 반복되고 있다. 따라서 10단위 문자열을 숫자로 변환한 후에 각각 '만'과 '억' 단위를 곱해 주는 방식으로 처리할 수 있다.

숫자 변환 알고리즘은 그림 3.5와 같으며, 이 알고리즘은 두 단계 과정으로 구성된다. 첫 번째 단계에서는 '일/이/...../구'를 '1/2/.../9'로 변환하는 단순한 작업이다. 즉, (예2)의 입력 어절에서 '일/이/.../구' 등 각 숫자들을 (예1)과 같이 아라비아 숫자로 변환한다.

Algorithm conv_numeral_unit(char *in, *out)

{

int i=0;

int man1 =10, man2;

char *pb=in, pe;

while (*pb && (pe=get_MAN_unit(pb))) {

man2 = is_numeral_10000x(*pe);

if (man1-man2 == 2) { /* '억'단위 없음 */

out[i] = out[i+1] = out[i+2] = out[i+3] = '0';

i = i + 4;

} else if (man1 <=man2)

return; /* '조/억/만' 순서 오류 */

man1 = man2;

out[i] = out[i+1] = out[i+2] = out[i+3] = '0';

set_1000_unit (pb, pe, out, i);

i = i + 4;

pb = pe+1;

}

out[i+4] = '\0';

remove_leading_0s(out);

}

그림 3.6 수사 어절 변환 알고리즘-2

입력 어절 n1에 대해 첫 번째 단계에서 모든 '일/이/.../구'를 '1/2/.../9'로 변환한 결과인 n2는 (예1)과 같이 아라비아 숫자와 10 단위 연산자 '십/백/천/만/억/조'로 구성된 스트링이다. 함수 conv_numeral_unit()은 n2를 다시 '345634563456'과 같이 변환해 주는 역할을 한다. 함수 conv_numeral_unit()은 그림 3.6과 같이 기술된다(부록-4 참조).

그림 3.6의 conv_numeral_unit()에서 숫자 변환 과정은 다음과 같다. 입력 어절을 '조/억/만' 단위로 분할하여 처리한다. 변환된 결과는 네 문자씩 "0000"으로 초기화하여 각 위치에 '0' 대신 해당 10진수 문자로 대치한다. 알고리즘의 변수 pb와 pe는 '천/백/십/일'의 시작 및 끝 위치이다.

변수 man1과 man2는 '조/억/만' 단위를 구분한 결과를 저장하기 위한 용도로 사용된다. man1은 '조/어/만' 중에서 처음 출현한 단위에 대한 값이고, man2는 두 번째 출현한 단위에 대한 값으로서 0, 1('만' 단위), 2('억' 단위), 3('조' 단위)을 가질 수 있으며 man1은 3보다 큰 수로 초기화한다.

'억' 단위가 없이 '조' 뒤에 '만'이 오는 것은 man1-1, man2=3이 되어 두 변수의 차가 2가 되며, 이 경우는 "0000"을 추가해 준다. 또한, man1의 값이 man2보다 큰 경우는 '조...억...만'의 순서가 틀린 것이므로 오류이다.

변수 pb와 pe에 의해 발견된 '천/백/십/일' 문자열은 set_1000_unit()에 의하여 "0000" 위치에 해당 10진수 문자로 대치된다. 함수 set_1000_unit()은 10단위 수사 '천/백/십'을 인식하여 "0000"의 해당 위치의 '0'을 10단위 수사 앞에 오는 아라비아 숫자로 대치한다. 마지막으로 앞 부분에 '0'이 들어있는 것들은 remove_leading_0s()에 의해 삭제한다.

4. 띄어쓴 수사 어절 결합 방법

'2백 3십 5와'와 같이 입력 문장에서 두 어절 이상으로 띄어쓴 수사 어절은 전처리 과정에서 한 어절로 결합한다. 이러한 어절들을 한 어절로 결합할 때는 앞 뒤 어절이 수사 어절인지를 검사하여 두 어절을 하나로 결합했을 때 역시 수사 어절인 경우로 제한한다. 각 어절이 수사 어절인지, 아닌지를 판단하는 그림 3.4의 수사 어절 인식 알고리즘을 이용한다.

띄어쓴 수사 어절들로부터 직접 아라비아 숫자 문자열로 직접 변환하는 방법도 가능하다. 그러나 띄어쓴 수사 어절을 미리 결합하는 방법은 그림 3.4의 수사 인식 알고리즘을 이용하기 때문에 매우 쉽게 문제가 해결된다. 또한, 그림 3.5와 그림 3.6에 기술된 수사 변환 알고리즘을 그대로 사용할 수 있는 장점이 있으며, 자연언어 등 다른 응용 분야에서 활용될 수 있으므로 더 효율적이다.

제 4 장 자연언어 질의어 처리기

제 1절 질의어 처리기 요구사항

1. 가격지정 연산자

자연언어 질의문장에서 가격 지정어는 가격지정 연산자와 함께 사용되는 경우가 많다. 이 경우에 가격지정 연산자는 일정한 범위를 제약한다. 질의문에 나타날 수 있는 가격지정 연산자는 일정한 범위를 제약한다. 질의문에 나타날 수 있는 가격지정 연산자는 다양하며, 각각의 의미에 대해 범위를 추론하여 그 범위를 수량화하여야 한다.

- '대'

질의 : 1백만원대 tv를 사고 싶어요

응답 : 최저 1000000원 최고 1999999원

질의 : 백오십만원대 tv를 사고 싶어요

응답 : 최저 1500000원 최고 1599999원

- '이상'

질의 : 1000000원 이상의 TV를 사고 싶어요

응답 : 최저 1000000원 최고 MAXPRICE 원

- '이하'

질의 : 1000000원 이하의 TV를 사고 싶어요

응답 : 최저 0원 최고 1000000원

- '초과'

질의 : 1000000원을 초과하는 TV를 사고 싶어요

응답 : 최저 1000001원 (1000000+1) 최고 MAXPRICE 원

- '미만'

질의 : 1000000원 미만의 TV를 사고 싶어요

응답 : 최저 0원 최고 999999원(1000000-1)

- '에서...사이'

질의 : 90만윈에서 100만원 사이의 테레비를 사고 싶어요

응답 : 최저 91만원 최고 999999원

- '부터....까지'

질의 : 1000000원부터 1500000원까지의 테레비를 사고 싶어요

응답 : 최저 1000000원 최고 1500000원

- '제일/가장 싼', '제일/가장 비싼'

질의 : 제일 싼 테레비를 사고 싶어요

응답 : 최저 0원 최고 MAXPRICE 원

- '최대', '최고'

질의 : 최고 1000000원의 TV를 사고 싶어요

TV의 최고 가격을 알고 싶어요

응답 : 최저 0원 최고 1000000원 ('이하'과 동일)

최저 0원 최고 MAXPRICE 원('제일 비싼'과 동일)

- '최소', '최저'

질의 : 최소 1000000원의 TV를 사고 싶어요

TV의 최소 가격을 알고 싶어요

응답 : 최저 1000000원 최고 MAXPRICE 원('이상'과 동일)

최저 0원 최고 MAXPRICE 원('제일 싼'과 동일)

- '정도'

질의 : 1백만원 정도의 tv를 사고 싶어요

응답 : 최저 1000000원 최고 1999999원

- '가량'

질의 : 값이 1백만원 가량 하는 tv를 사고 싶어요

응답 : 최저 1000000원 최고 1999999원

- '약'

질의 : 값이 약 1백만원인 tv를 사고 싶어요

응답 : 최저 800000원 최고 1200000원

- '짜리'

질의 : 1백만원짜리 tv를 사고 싶어요

응답 : 최저 1000000원 최고 1000000원

- '-'

질의 : 1-2백만원대(백만-2백만) tv를 사고 싶어요

응답 : 최저 1000000원 최고 2999999원

- '~'

질의 : 1~2백만원대 tv를 사고 싶어요

응답 : 최저 1000000원 최고 2999999원

2. 부울리언 질의문

자연언어 질의문에서는 "삼성 TV와 LG 냉장고"와 같이 '와/과/또는/그리고' 등 접속조사에 의해 연결되는 부울리언 형태의 질의문이 가능하다. 이때 '와/과'는 모호성이 발생하기 때문에 AND로 연결되는지, 아니면 OR로 연결되는지가 불분명한 경우가 발생한다.

· 입력 - 부울리언 문

자연언어 질의문: 삼성 TV와 LG 냉장고

부울리언 질의문: ((삼성) and (TV)) and ((LG) and (냉장고))

((삼성) and (TV) or ((LG) and (냉장고))

· 출력 - 자연언어 질의문과 동일

부울리언 질의문 정형화하는 문제는 지능적인 요소가 필요하며 사람이 판단하더라도 모호하기 때문에 처리하기가 매우 곤란한 문제이다. 따라서 본 연구에서는 다루지 않기로 한다.

제 2 절 질의어 처리기의 출력 구조

자연언어 질의어는 주로 데이터베스의 사용자 인터페이스로 사용되는 연구가 주를 이루었으며, 데이터베이스 질의어는 SQL 문장이 대표적이다. 따라서 자연언어 질의어 분석결과를 SQL문 형태로 하는 것이 보편적이다. 그러나 본 연구에서 자연언어 질의어는 데이터베이스 질의어가 아니라 상품구매 시에 사용되는 사용자 인터페이스이다.

상품구매 시에 필요한 정보는 '상품명'과 '최소값', 그리고 '최대값'이다. 이 밖에도 최소값과 최대값 중에서 어떤 쪽에 더 우선 순위가 있는지를 나타내는 정보가 표현되는 것이 좋다. 아래 구조체 Query_List는 질의문에 대한 분석 결과를 반환하는 함수에 대한 출력 구조이다.

#define MAX_PRICE MAXINT

struct Query_List {

struct Noun_List *noun_list;

int min_price;

int max_price;

struct Query_List *link;

} query_list;

그림 4.1 질의어 처리 결과의 출력 구조

질의어 처리기의 출력 구조에서 최소값과 최대값이 주로 사용되지만, '100만원 정도의 TV의 예처럼 최소값과 최대값 정보만으로는 부족한 점이 있다. 이 경우에는 최대-최소값이 주어지더라도 100만원에 근접한 TV가 우선적으로 제시되어야 하므로 제된 상품들을 순서화할 때 필요한 정보를 표현해 주는 방안이 요구된다.

제 3 절 질의어 처리기의 설계

1. 질의어 처리기의 구조

자연언어 질의어 처리 시스템의 입력은 질의어 문장이다. 질의문은 자연언어로 주어지며, 질의문을 분석하려면 형태소 분석과 구문분석이 필수적이다. 일반적으로 자연언어 질의문으로 연구되고 있는 데이터베이스 질의어의 경우에는 형태소 분석과 의미분석에 의해 질의문을 분석하고 이를 SQL문으로 변환해 준다.

전자거래에서도 질의문이 자연언어이므로 형태소 분석과 구문분석이 필수적이다. 그러나 전자거래에서 질의문은 상품명과 상품의 가격정보를 추출하는 것이 주목적이므로 형태소 분석과 구문분석을 이용하여 처리할 수 있다. 그런데 상품 가격에 관한 정보는 수사 어절로 표현되므로 전자거래용 질의어 처리기에서는 수사 어절을 인식하고 처리하는 기능이 매우 중요하다.

수사 어절을 인식하고 띄어쓴 수사 어절을 결합하는 기능은 제3장에서 구현된 모듈을 이용한다. 질의문이 입력되면 전처리 과정에서 입력 문장을 분석하여 수사 어절을 인식하고 띄어쓴 수사어절은 한 어절로 결합한다. 이 문장에 대해 형태소 분석을 수행하여 형태소 분석결과에 대해 수사 어절을 표준형(아라비아 숫자로만 구성된 문자열)으로 변환한다.

수사 변환 과정을 거친 형태소 분석결과는 다시 구문분석기를 통해 구문분석 결과를 생성하고, 구문분석기를 결과로부터 상품명이 포함된 구문을 인식한다. 상품명이 인식된 구문에 대해 상품명과 상품명에 대한 최대-최소 가격을 구한다. 이러한 질의어 처리 과정은 그림 4.2와 같이 기술된다.

그림 4.2 전자거래용 질의어 처리가 구조도

2. 구문 분석 결과의 출력 구조체

상품명을 인식하고 최대-최소 가격을 인식하려면 구문분석 결과를 이용해야 하므로 구문분석기가 생성하는 분석결과에 대한 구조체가 정의되어야 한다. 분석결과에 대한 구조체는 구문분석기에서 정의된 것을 그대로 이용한다. HAM 라이브러리에서 한국어 구문분석은 의존문법을 기반으로 하고 있다. 구문분석 결과는 어절간의 의존관계를 기술하는 구조로 되어 있다. 어절간의 지배-의존 관계를 인식하는 구문분석 결과의 구조체는 그림 4.3과 같다.

typedef struct nodes {

HAM_SHORT gov; /* index of governor */

HAM_SHORT nch; /* number of children */

HAM_SHORT nod; /* number of all nodes */

/* num, of children & grand children */

HAM_SHORT up; /* link to parent */

HAM_SHORT down; /* link to 1st child */

HAM_SHORT left; /* link to left sibling */

HAM_SHORT right; /* link to right sibling */

HAM_UCHAR rel; /* relation type */

HAM_UCHAR fix; /* relation is fixed? */

HAM_SHORT dep; /* depth of relation */

} HAM_NODES, *HAM_PNODES;

#define MAXPREDS 30

#define MAXNOUNS 30

typedef struct parsed { /* Korean dependency parser */

HAM_PUCHAR sent; /* sentence string */

HAM_SHORT type; /* sentence type */

HAM_PWORD pwf; /* morph analed word frames */

HAM_SHORT root; /* down link to 1st child of root */

HAM_SHORT nch0; /* number of children for root */

HAM_SHORT nnode; /* num. of tokens in sent */

struct nodes node[MAXWORDS]; /* tokens in sent */

struct head *hpr[MAXWORDS]; /* head-daughter nodes */

} HAM_PARES, *HAM_PPARES;

그림 4.3 구문분석 결과 구조체: 지배_의존 관계

그림 4.3의 지배-의존 구조는 구문분석기를 구현하는데 적합한 구조이나 이 결과를 실제로 활용하기에는 불편한 점이 많다. 따라서 HAM 라이브러리에서는 구문분석 결과를 실제로 활용하는데 편리하도록 Head-Daughter 관계를 표현하는 구문분석 주조체를 정의하고 있다. Head-Daughter를 기반으로 한 구문분석 결과의 구조체는 그림 4.4와 같다

/*

각 어절 node는 head가 될 수 있다.

단, 명사+명사+...는 하나의 node로 결합한다.

*/

typedef struct head { /* 어미로 끝나는 어절 */

HAM_PWORD pw; /* 어절에 대한 형태소 분석결과 */

HAM_PRESULT pr; /* best result --> (pw ->result)+(pw->gr[0])*/

HAM_PUCHAR kstem; /* 용언: '하/되/....'포함 or 명사(이다의 경우) */

/* N+N+..+N : 하나의 head로 & blank 삽입 */

HAM_SHORT wid; /* i-th word in the sentence */

HAM_UCHAR role; /* dependency relation type? */

/* 용언 head: 주어, 목적어, 부사어, 부사 */

/*체언 head: 관형어, 관형어미, .... */

HAM_UCHAR type; /* 0: unknown, 1:noun, 2:noun+이다, 3:verb, 4:AID등 */

struct daughters *link; /* pointer to daughters of this node */

struct head *mom; /* pointer to the mother node */

struct head *sis; /* pointer to the left sister */

} KET_HEAD, *KET_PHEAD;

#define MAX_DATR 16 /* head 1개에 허용되는 최대 daughter 개수 */

/*

head에 대한 daughter nodes: head는 최대 'MAX_DATR' 개의 daughter

role[i-i]: i_th daughter의 head에 대한 pointer

*/

typedef struct daughters { /* list of components: 주어, 목적어 등 */

HAM_SHORT nson; /* number of daughters */

struct head *son[MAX_DATR]; /* pointer array to daughters */

} KET_DATR, *KET_PDATR:

typedef struct parse { /* head-daughter structure */

HAM_PUCHAR sent; /* sentence string */

HAM_SHORT type; /* sentence type */

KET_PHEAD root; /* root node */

HAM_PPARES dpr; /* dependency parsing result */

} KET_PARES, *KET_PPARES;

그림 4.4 구문분석 결과 구조체: head-daughter 관계

제 4 절 질의어 처리기 구현

1. 질의어 처리기의 구조

질의어 처리기는 질의문에 대하여 띄어쓴 어절을 인식하고 이를 한 어절로 결합하는 전처리 과정과 구문분석, 그리고 구문분석 결과로 생성된 어휘형태소에 대하여 수사 어절을 표준형으로 변환하는 과정, 그리고 구문분석 결과를 분석하여 상품명과 최대-최소 가격을 추출하는 과정으로 구성된다.

그림 4.5 자연언어 질의어 처리 과정

2. 가격지정 연산자

수사 어절과 함께 사용되는 가격지정 연산자에는 여러 가지 유형들이 있는데, 연산자의 특성 및 출현 위치에 따라 가격지정 연산자를 분류하면 표 4.1과 같다. '동일 어절'에 속하는 것은 가격 지정어와 가격지정 연산자가 동일한 어절에 나타난 것이다. '기타'에 속하는 것으로 '가장 값이 싼/비싼'과 같은 경우는 가격 지정어가 출현하지 않는다. 이 경우는 값이 가장 싼 2-3개 품목을 제시해 줄 수 있도록 가격의 범위 외에 최대값을 중심으로 할 것인지, 최소값을 중심으로 할 것인지를 표시하는 항목이 있어야 한다.

표 4.1 가격지정 연산자 유형


가격 지정 연산자

동일 어절

대, 짜리, '-', '~'

우측 어절

이상, 이하, 초과, 미만, 정도, 가량

좌측 어절

약, 최대, 최고, 최소, 최저

2어절이상

부터(에서)-까지 (사이/이하/미만)

기 타

제일/가장/비교적/정말 (값)싼/비싼



가격 지정 연산자는 다양한 표현이 가능하기 때문에 각각의 경우에 그 의미를 파악해야 한다. 어절 표현의 의미를 파악하려면 의미분석이 수반되어야 하나 의미분석 기술은 현재 실용적인 목적으로 활용하기가 어렵다. 궁극적으로는 가격지정 연산자의 의미분석이 수반되어야 하는 문제이지만, 이 경우에는 그 처리 범위가 넓지 않으므로 각각의 경우에 대해 부분적인 구문분석 기술을 응용함으로써 인식이 가능하다.

가격지정 연산자의 의미는 경우에 따라 다르며 각 연산자에 대하여 최대치와 최소값을 구하는 방법 또한 개별적인 의미에 따라 결정된다. 예를 들어, '1백만원대'의 의미는 1,000,000원 이상이고 2,000,000원 미만을 의미하고, '백만원 이하'는 0~1,000,000을 의미한다. 이와 같이 가격지정 연산자를 최소값과 최대값으로 수량화한다.

질의어 분석의 문제의 핵심은 질의문으로부터 상품명과 가격 지정어, 그리고 수사 어절을 인식하는 것이다. 가격지정 연산자는 수사 어절 앞뒤에 결합되는 것이 일반적이므로 수사 어절 전후 어절을 검사함으로써 가능하다. 가격 지정어가 인식되었으면, 가격지정 연산자를 추출하여 각 연산자들에 대해 가격의 범위를 최소값과 최대값으로 변환한다.

3. 질의어 분석 및 결과 생성

구문분석 결과로부터 질의어를 분석하고 분석결과를 생성하는 과정을 구문분석 트리를 탐색하면서 상품명과 가격지정 연산자를 인식하는 작업이다. 따라서 질의어 처리기의 입력은 구문분석 트리이고, 출력은 상품명과 상품가격 정보를 포함하는 구조체 리스트이다.

질의어 분석결과를 저장하는 구조체를 4장 2절의 그림 4.1에 정의하였는데, 질의어 처리기를 구현할 때 편의성을 고려하여 이를 수정하여 사용한다. 그림 4.6은 각 상품명에 대한 가격정보를 저장하는 구조체이다. 질의어에 2개 이상의 상품명이 나타난 것은 next 포인터를 이용하여 연결된다. 그림 4.6에서 최대값과 최소값을 문자열로 정의한 것은 질의문에서 인식된 수사 어절이 문자열로 되어 있으므로 이를 그대로 활용하기 위한 것이다.

# define MIN_PRICE "0"

# define MAX_PRICE "999999999"

typedef struct Query_List {

unsigned char *item; /* product name */

unsigned char mini[99]; /* minimum price */

unsigned char mini[99]; /* maximum price */

struct Query_List *next;

} QUERY_LIST, *QUERY_PLIST;

그림 4.6 질의어 분석결과 구조체

질의어 처리 알고리즘은 그림 4.7과 같다. 이 알고리즘에서 입력은 구문분석 트리의 root 포인터이다. 이 트리를 탐색하면서 각 노드마다 질의노드 (query node)인지를 검사한다. 질의노드는 상품명에 대한 노드로서 상품명이 인식되면 이 노드와 자식노드들을 탐색하여 필요한 정보를 추출한다.

Algorithm gen_query_list(node, head)

KET_PHEAD node; QUERY_PLIST node;

{

QUERY_PLIST tail=head;

tail = last query node of 'node';

if (is_query_node(node)) { /* 상품명 노드 */

if (head == NULL) /* first node */

tail = head;

else tail = tail->next;

set_query_node(tail, node); /* 질의정보 */

}

for all each children node

head = gen_query_ list(child_node, head);

return head;

}

그림 4.7 질의어 처리 알고리즘

그림 4.7에서 어떤 노드가 질의노드인지 아닌지를 검사하는 방법은 자식노드(혹은 자식노드의 자식노드) 중에서 가격 연산자와 수사 어절이 있는지를 검사함으로써 가능하다. 상품명과 가격정보를 추출하는 set_query_node()는 가격 연산자 유형에 따라 구문트리로부터 최대-최소값을 추출한다.

가격정보는 각 연산자의 유형에 따라 약간의 차이가 있다. 실제로 전자거래 시스템에서 활용할 때는 이러한 정보를 사용할 가능성이 있다. 따라서 각 유형별 가격 연산자들의 유형을 정의하면 그림 4.8과 같다.

/*

가격 연산자 유형

*/

# define QTYPE_UNKNOWN 0

# define QTYPE_ISANG 11

# define QTYPE_IHA 12

# define QTYPE_MIMAN 13

# define QTYPE_CHOKWA 14

# define QTYPE_JJEUM 21

# define QTYPE_JUNGDO 22

# define QTYPE_JJARI 23

# define QTYPE_WONDAE 24

# define QTYPE_CHIOKO 31

# define QTYPE_CHOISO 32

# define QTYPE_ISANG_IHA 41

그림 4.8 가격 연산자 유형 정의

제 5 장 결론

전자거래용 형태소 분석과 구문분석기를 설계하고 구현하기 위해 범용 한국어 라이브러리를 충분히 활용하고, 이를 수정 또는 확장하여 전자거래에서 중요시되고 있는 가격과 관련된 숫자를 인식할 수 있도록 하였다.

수사 어절 처리에서 체언 위치에 나타나는 숫자 혹은 한글과 숫자 혼용어를 인식하는 기술은 비교적 안정되어 있다. 그러나 수사 어절은 아라비아 숫자로만 표기된 경우, 한글로 표기된 경우, 아라비아 숫자와 한글이 혼용된 경우 등 다양하게 표현되고 있으며 이를 유형별로 분류하여 정형화하였다.

구분자 ','가 포함되거나 한글로만 표현한 것, 그리고 한글과 아라비아 숫자를 병행한 것 등 각 경우에 대하여 이를 아라비아 숫자로 구성된 문자열로 변환하는 알고리즘을 설계하고 구현하였다. 또한, 한글과 숫자가 혼용된 수사 어절을 띄어쓴 경우에는 전처리 과정에서 이를 인식하여 한 어절로 결합한 후에 아라비아 숫자로 구성된 문자열로 변환하였다.

실험을 통하여 수사 어절을 인식하고 변환하는 기능이 성공적으로 작동됨을 확인하였으며, 실험 과정에서 일반 명사를 아라비아로 숫자로 변환하는 오류를 발견하고 일반 명사로 사용되는 것들은 변환되지 않도록 예외처리 기능을 추가하였다.

전자거래에서 향후 사용자 인터페이스로 활용할 수 있는 자연언어 질의어를 처리하기 위하여 시제품을 구현하였다. 자연언어 질의어는 그 유형이 매우 다양하여 모든 유형을 포괄적으로 처리하기는 쉽지 않다. 따라서 현재까지 발견된 가격지정 연산자와 가격 표시 구문을 인식하여 이 유형들에 대해 질의어로부터 상품명과 최소값과 최대값을 추출하는 방안을 제시하고 알고리즘을 설계하여 구현하였다.

지금까지 한국어 구문분석 기술은 전체 문장을 대상으로 한 범용성을 지향함으로써 구조적 모호성 문제와 정확도 때문에 실용적으로 응용하기 어려웠다. 본 연구에서는 전자거래를 위한 사용자 인터페이스에서 자연언어 질의어를 처리하기 위하여 한국어 구문분석 기술을 적용하여 실험하였다. 그 결과로 좀더 다양한 실험을 통해 성능 개선이 이루어진다면, 문장 유형이 제한된 응용 시스템에서 구문분석 시술을 실용적으로 사용할 수 있음을 알 수 있었다.

참고 문헌

[1] 강승식, "한국어 형태소 분석을 위한 단어 유형 분류와 자료구조", 제 8회 한글 및 한국어 정보처리 학술발표 논문집, pp.241-245, 1996년 10월.

[2] 강승식, "상대적 출현빈도를 이용한 조사/어미 사전의 구성', 제7회 한글 및 한국어 정보처리 학술발표 논문집, pp.188-194, 1995.

[3] 고영근, "현대 국어의 선어말어미에 대한 구조적 연구 - 특히 배열의 차례를 중심으로", 어학연구, 3권, 1호, 서울대학교 어학연구소, 1967.

[4] 고영근, 국어 형태론 연구, 서울대학교 출판부, 1989.

[5] 금성출판사 사서부, 뉴에이스 국어 사전, 금성출판사, 1989.

[6] 김성용, 최기선, 김길창, "Tabular Parsing 방법과 접속 정보를 이용한 한국어 형태소 분석기", 정보과학회 인공지능연구회 춘계 인공지능 학술 발표회 논문집, pp.133-147, 1987.

[7] 김덕봉, 최기선, 강재우, "한국어 형태소 처리와 사전 - 접속정보를 이용한 한글 철자 및 띄어쓰기 검사기 -", 어학연구, 26권, 1호, pp.87-113, 1990

[8] 남기심, 고영근, 표준 국어 문법론, 탑출판사, 1986.

[9] 박세영, 김권양, 오길록, "자연어 처리를 위한 한국어 syntax 구조에 관한 연구", 정보과학회논문지, 12권, 2호, pp.138-150, 1985.

[10] 박종만, "효율적인 한국어 형태소 분석기 및 철자 검사 교정기의 구현", 서울대학교 공학석사 학위논문, 1990.

[11] 김정민, 권혁철, "한국어 형태소 분석에서의 수사 처리", 제3회 한글 및 한국어 정보처리 학술발표 논문집, pp.178-187.1991.

[12] 서태룡, 국어 활용어미의 형태와 의미, 탑출판사, 1988.

[13] 이은철, 이종혁, "계층적 기호 접속정보를 이용한 한국어 형태소 분석기의 구현", 제4회 한글 및 한국어 정보처리 학술발표 논문집, pp.95-104, 1992

[14] 임희석, 윤보현, 임해창, "배제정보를 이용한 효율적인 한국어 형태소 분석기", 정보과학회 논문지, , 22권 6호, pp.957-964, 1995.

[15] 홍영국, 이종혁, "한국어 의존 해석을 위한 형태-통사적 품사 분류 체계", 정보과학회논문지(B), 22권 9호, pp.1375-1383, 1995.

[16] 최재혁, 이상조, "양방향 최장일치법에 의한 한국어 형태소 분석기에서의 사전 검색 횟수 감소 방안", 정보과학회논문지, 20권 10호, pp.1497-1507, 1993.

[17] 조영환, 차희준, 김길창, "확장 사전 환경에서의 한국어 형태소 해석과 생성", 제5회 한글 및 한국어 정보처리 학술발표 논문집, pp.355-368, 1993.

[18] 최형석, 이주근, "자연어 어절 처리 앨고리즘:, 한국정보과학회 추계 학술발표회 논문집, 11권 2호, 1984.

[19] 장병탁, 김영택, "다중언어 형태소 분석 및 합성을 위한 언어 규칙의 기계학습", 한국정보과학회 논문지, 17권 4호, pp.463-474, 1990.

[20] 권혁철, 채영숙, 김재원, 김민정, "한국어 철자 검색을 위한 형태소 분석 기법", 국어정보학회 학술발표 논문집, pp.179-186, 1991.

[21] 김병희, 임권묵, 송만석, "형태소 접속 특성과 인접 말마디 정보를 이용한 형태소 분석기", 제5회 한글 및 한국어 정보처리 학술발표 논문집, pp.395-404, 1993.

[22] E. Barton, "Computational Complexity in T재-Level Morphology," 24th Annual Meeting of the Association for Computational Linguistics, 1986.

[23] E. Barton, R. Berwick and E. Ristad, "The Complexity of Two-Level Morphology," chapter 5 in Computational Complexity and Natural Language, MIT Press, Cambridge, MA, 1987.

[24] L.J. Cahill "Syllable-based Morphology," Proceedings of the 13th Internatioanl Conference on Computational Linguistics, Vol.3, pp.48-53, 1990.

[25] J.S Chang, "A Multiple-Corpus Approach to Identification of Chinese Surname-Names," Proceedings of Natural Language Processing Pacific Rim Symposium, Singapore, 1991.

[26] K.J. Chen and S.H. Liu, "Word Identification for Mandarin Chinese Sentences," Proceedings of the 14th Internatioanl Conference on Computational Linguistics, Vol.1, pp,101-107, 1992.

[27] W. Daelemans, An Object-Oriented Computer Model of Morphonological Aspects of Dutch, PhD dissertation, University of Leuven, 1987.

[28] G.E. Heidorn, K. Jensen, L.A. Miller, R.J. Byrd, and M.S. Chodorow, "The EPISTLE Text-Critiquing System," IBM System Journal, Vol.21, No.3, pp.305-326, 1982.

[29] K, Jensen, G. Heidorn, and S. Richardson, "PLNLP, PEG and CRITIQUE: Three Contributions to Computing in Humanities," Research Report RC-11841, IBM Thomas J. Watson Research Center, Yorktown Heights, New York, 1986

[30] D. Karp, Y. Schabes, M. Zaidel and D. Egedi, "A Freely Available Wide Coverage Morphological Analyzer for English," Proceedings of the 14th Conference Conference on Computational Linguistics, pp.141-148, 1992.

[31] L. Kartunnen and A. M. Zwichy, "Natural Language Parsing in Artificial Intelligence," Natural Language Parsing, Chapter 1., Cambridge University Press, 1985.

[32] L, Kartunnen, R. M. Kaplan, and A. Zaenen, "Two-Level Morphology with Composition," Proceedings of the 14th Conference on Computational Linguistics, pp.141-148, 1992.

[33] Y.S. Kim Aspects of Korean Morphology, PhD dissertion, University of Texas, Austin, 1984.

[34] J.M. Kim Phonology and syntax of Korean Morphology, PhD dissertation, University of Suthern California, 1986.

[35] K. Koskenniemi, A Two-level Morphological Processor, PhD dissertation, University of Helsinki, 1983.

[36] K. Koskenniemi, "Two-level Model for Morphological Analysis," Proceedings of the 8th International Joint Conference on Artificial Intelligence, pp.683-685, 1983.

[37] K. Koskenniemi, "Complexity, Two-Level Morphology and Finnish," Proceedings of the 12th Conference on Computational Linguistics. pp.335-339, 1988.

[38] T. Mine, R. Taniguchi, and M. Amamiya, "Coordinated Morphological and Syntactic Analysis of Japanese Language," Proceedings of the 8th International Joint Conference on Artificial Intelligence, pp.10102-1017, 1991.

[39] T. Pachunke, O. Mertineit, K. Wothke and R. Schmidt, "Broad Coverage Automatic Morphological Segmentation of German Words," Proceedings of the 14th Conference on Computational Linguistics, pp.1219-1222, 1992.

[40] G.J. Russel, G.D. Richie, S.G. Pulman and A.W. Black, "A Dictionary and Morphological Analyzer for English," Proceedings of the 11th International Conference on Computational Linguistics, pp.277-279, 1986.

[41] A. Solak and K. Oflazer, "Parsing Agglutinative Word Structures and Its Application to Spelling Checking for Turkish," Proceedings of the 14th Internatioanl Conference on Computational Linguistics, Vol.1, pp.39-45, 1992.

[42] R. Sproat and C. Shih, "A Statistical Method for Finding Word Boundaries in Chinese Text," Proceedings of International Conference on Computer Processing of Chinese and Oriental Languages, Vol.4, No.4, 1990.

[43] H. Trost, "X2MORF: A Morphological Component Based on Augmented Two-Level Morphology," Proceedings of the 8th International Joint Conference on Artificial Intelligence, pp.1024-1030, 1991.

[44] J.J. Webster and C. Kit, "Tokenization as the Initial Phase in NLP," Proceedings of the 14th International Conference on Computational Linguistics, Vol.4, pp.l106-1110, 1992.

[45] C.L Yeh and H.J. Lee, "Rule-based Identification for Mandarin Chinese Sentences - A Unification Approach," Proceedings of the International Conference on Computer Processing of Chinese and Oriental Languages, Vol.5, No.2, 1991.

[46] U. Zernik and P. Jacobs, "Tagging for Learning: Collecting Thematic Relations from Corpus," Proceedings of the 13th International Conference on Computational Linguistics, Vol.1, pp.34-39, 1990.

부록-1. HAM 라이브러리의 단어 유형

/*

File Name: wordpatn.h

Description:

Hangul word patterns for HAM

Written by: Kang, Seung-Shik 1997. 4. 27.

*/

# define HAM_PTN_N 1 /* 체언 : N/PN/NM/XN/CN/UN/AS/HJ/ET */

# define HAM_PTN_NJ 2 /* 체언 + 조사 */

# define HAM_PTN_NSM 3 /* 체언 + 용언화접미사 + 어미 */

# define HAM_PTN_NSMJ 4 /* 체언 + 용언화접미사 + '음/기' + 조사 */

# define HAM_PTN_NSMXM 5 /* 체언 + 용언화접미사 +'아/어'+보조용언 +어미 */

# define HAM_PTN_NJCM 6 /* 체언 + '에서/부터/에서부터' + '이' +어미 */

# define HAM_PTN_VM 11 /* 용언 +어미 */

# define HAM_PTN_VMJ 12 /* 용언 + '음/기' +조사 */

# define HAM_PTN_VMCM 13 /* 용언 + '음/기' +'이' +어미 */

# define HAM_PTN_VMXM 14 /* 용언 + '아/어' +보조용언 +어미 */

# define HAM_PTN_VMXMJ 15 /* 용언 + '아/어' +보조용언 + '음/기' +조사*/

# define HAM_PTN_AID 21 /* 단일어 : 부사, 관형사, 감탄사 */

# define HAM_PTN_ADVJ 22 /* 부사 + 조사 : '빨리도' */

# define HAM_PTN_NVM 31 /* 체언 + 동사 + 어미 */

# define HAM_PTN_ZZZ 35 /* 문장부호, KS 완성형 기호열, 단독조사/어미 */

부록-2. HAM 라이브러리의 품사 유형

/*

File name : pos-patn.h

Description:

Definition of sentence types and parts of speech

Written by: Kang, Seung-shik 1993. 4. 3.

*/

/* */

/* */

/* CLASSIFICATION OF PARTS OF SPEECH */

/* */

/* */

/*

/*

3(basic) + 2(special) types of stem for 'pos'

/*

#define HAM_POS_NPXM 'N' /* noun, pnoun, xn, nume */

#define HAM_POS_VJXV 'V' /* verb, adj, xverb */

#define HAM_POS_AID 'Z' /* adv, det, excl */

#define HAM_POS_PUNC 'P' /* punctuation mark */

#define HAM_POS_SYMB 'S' /* special symbols */

/*

normal types of stem for 'pos2'

Only some of following symbols are used.

*/

#define HAM_POS_NOUN 'N' /* noun */

#define HAM_POS_PNOUN 'P' /* pronoun */

#define HAM_POS_XNOUN 'X' /* dependent noun */

#define HAM_POS_NUMERAL 'M' /* numeral */

#define HAM_POS_PROPER 'O' /* proper noun */

#define HAM_POS_CNOUN 'C' /* compound noun guessed */

#define HAM_POS_NOUNK 'U' /* guessed as noun */

#define HAM_POS_ASCall '@' /* all alphanumeric chars */

#define HAM_POS_ASCend '$' /* end with alphanumeric */

#define HAM_POS_ASCmid '*' /* ..+alphanumeric+Hangul */

/* defined for numeral to digit conversion */

#define HAM_POS_digits '1' /* digit-string */

#define HAM_POS_digitH '2' /* digit-string + Hangul */

#define HAM_POS_VERB 'V' /* verb */

#define HAM_POS_ADJ 'J' /* adjective */

#define HAM_POS_XVERB 'X' /* auxiliary verb */

#define HAM_POS_ADV 'B' /* adverb */

#define HAM_POS_DET 'D' /* determiner */

#define HAM_POS_EXCL 'L' /* exclamation */

#define HAM_POS_JOSA 'j' /* Korean Josa */

#define HAM_POS_COPULA 'c' /* copula '-wi-' */

#define HAM_POS_EOMI 'e' /* final Ending */

#define HAM_POS_PEOMI 'f' /* prefinal Ending */

#define HAM_POS_NEOMI 'n' /* nominalizing Eomi */

#define HAM_POS_PREFIX 'p' /* prefixes */

#define HAM_POS_SFX_N 's' /* suffixes */

#define HAM_POS_SFX_V 't' /* suffixes */

#define HAM_POS_ETC 'z' /* not decided yet */

/* ASCII stem may be classified as follows: not used yet */

#define HAM_POS_ALPHA 'A' /* English alphabet /

#define HAM_POS_NUMBER '#' /* Arabic numbers */

#define HAM_POS_SMARK 'R' /* sentence markers */

#define HAM_POS_NVERBK 'Y' /* guessed as noun+verb*/

#define HAM_POS_SQUOTE 's' /* single quotation */

#define HAM_POS_DQUOTE 'd' /* double quotation */

#define HAM_POS_LPAREN 'l' /* left parenthesis */

#define HAM_POS_RPAREN 'r' /* right parenthesis */

부록-3. 수사 어절 인식 Source (일부)

/*

File Name: isnumstr.c

Description:

Numbers or numerals are converted to Arabic number.

Written by: Kang, Seung-shik 1998. 9.

*/

#include <ctype.h>

extern HAM_SHORT is_numeral_10unit();

extern HAM_UCHAR conv_numeral_1to9(); /* numeral.c */

/*

1음절 수사

*/

BOOLEAN is_numeric_1syl(s)

SYLLABLE s;

{

return (s1 == OxBFF8 || s == OxB3E2); /* 원/년 */

}

/*

2음절 수사

*/

BOOLEAN is_numeric_2syl(s1, s2)

SYLLABLE s1, s2;

{

return (s1 == OxB4DE && s2 == OxB7AF ∥ /* 달러 */

s1 == OxB9CC && s2 == OxC5CD); /* 미터 */

}

BOOLEAN is_numeric_noun2(s1, s2)

SYLLABLE s1, s2;

{

return (is_numeric_1syl(s1) ∥ is_numeric_2syl(s1, s2));

}

/*

숫자와 같이 사용되는 의존명사

'josaflag' is a type of input word.

0: 'p' is a stem

1: 'p' is a word-phrase with josa

*/

BOOLEAN is_numeric_noun(p, josaflag)

HAM_PUCHAR p; /* KSC5601 Hangul word */

HAM_SHORT josaflag; /* JOSA flag */

{

SYLLABLE syl = MAKSYL (*p, *(p+1));

if (josaflag)

return is_numeric_noun2(syl, MAKSYL (*(p+2), *(p+3)));

switch (strlen(p)) {

case 2: /* '원/년' 등*/

return is_numeric_1syl(syl);

case 4: /* '달러/미터' 등 */

return is_numeric_2syl(syl, MAKSYL(*(P+3), *(P+3)));

}

}

/*

일조, 이조. 사조. 육조, 구조.

이만, 오만. 팔만.

백사. 천사. 만사. 조사

*/

BOOLEAN is_nonnumeric (p, n1)

HAM_PUCHAR p;

HAM_UCHAR n1;

{

SYLLABLE s2;

s2 = MAKSYL (*(P+2), *(P+3));

if (s2 == 0xC1B6 && /* '조' */

(n1 =='1' ∥ n1 =='2' ∥ n1 =='4' ∥ n1 =='6' ∥n1 =='9'))

return 1;

else if (s2 == 0xB8B8 && /* '만' */

(n1=='2' ∥ n1=='5' ∥ n1=='8'))

return 1;

else if (s2 == 0xBBE7 && /* '사' */

(*p==0xB9 && *(p+1) == 0xE9 ∥ /* '백' */

*p == 0xC3 && *(p+1) == 0xB5 ∥ /*'천' */

*p == 0xB8 && *(P+1) == 0xB8 ∥ /* '만' */

*P == 0xC1 && *(P+1) == 0xB6)) /*'조' */

return 1; /* '백사/천사/만사/조사/ */

else redturn 0;

}

/*

Check if a string can be a number or not.

Return value:

1: All numeral syllables.

2: numeral syllables follows 'WON'

3: supposed to be a numeric string

0: otherwise -- NON-numeric string

'josaflag' is needed only for' is_numeric_noun()'

*/

HAM_SHORT is_num_string(word, josaflag)

HAM_PUCHAR word; /* KSC5601 Hangul code */

HAM_SHORT josaflag; /*flag for the word with JOSA */

{

HAM_PUCHAR p=word;

HAM_SHORT s1=1000; /* '천->백->십' is expected */

HAM_SHORT s2=1000; /* '조->억->만' is expected */

HAM_SHORT aflag=0; /* '1/2/3/....../9' was found? */

HAM_SHORT hflag=0 /* '일/이/......./구' was found? */

HAM_SHORT acount=0, hcount=0; /* num. of '1-9, 일-구' */

HAM_UCHAR ch, n1=0;

while (*p) {

switch (MAKSYL (*p, *(p+1))) {

case 0xBDCA: /* '십' */

if (s1 >= 10) {

s1 = 10; hflag = aflag = 0; p+=2;

} else return 0;

break;

case 0xB9E9: /* '백' */

if (s1 >= 100) {

s1 = 10/ hflag = aflag = 0; p+=2;

} else return 0;

break;

case 0xC3B5: /* '천' */

if (s1 == 1000) {

s1 = 100; hflag = aflag = 0; p+=2;

} else return 0;

break;

case 0xB8B8: /* '만' */

if (s2 >= 10) {

s1 = 1000; s2 = 0; hflag = aflag = 0; p+=2;

} else return 0;

break;

case 0xBEEF: /* '억' */

if (s1 >= 100) {

s1 = 1000/ hflag = aflag = 0; p+=2;

} else return 0;

break;

case 0xC1B6: /* '조' */

if (s2 >= 1000) {

s1 = 1000; s2 = 100; hflag = aflag = 0; p+=2;

} else return 0;

break;

default:

if (isdigit(*p)) {

if (hflag) return 0; /* disallow '삼8' */

aflag = 1; acount++; p++;

} else if (*p == ',' && !hflag && aflag) {

p++; /* skip comma */

} else if (ch = conv_numeral_1to9 (p)) {

if (hflag ∥ aflag)

return 0; /* disallow '삼팔' */

hflag = 1; hcount++; p+=2;

n1 = ch;

} else if (is_numeric_noun(p, josaflag)) {

/* 영원/일원/이원/삼원/사원/구원 */

if (p-word == 2 && n1 &&

*p == 0xBF && *(p+1) == 0xF8 && /* 원 */

(n1 >= '0' && n1 <= '4' ∥ n1 == '9' ))

return 0;

return 2; /* '원/년/미터/달러' 등 */

} else goto jump; /* non-numeric char */

}

}

jump:

if (p == word) reuturn 0;

if (p-word == 4 && is_nonnumeric(word, n1)) return 0;

if (!*p) return 1; /* all numeric char.s */

if (hcount > 1 ∥ p-word >= 4∥

acount && p-word-acount > 0 ∥

p-word > 5 ∥ acount > 3) return 3;

else return 0;

}

부록-4. 수사 어절 변환 source(일부)

/*

File Name: numeral. c

Description:

numbers or numerals are converted to Arabic number.

Written by: Kang, Seung-Shik 1998. 9.

*/

#include <ctype. h>

extern void conv_numeral_unit(); /* numunit. c */

extern HAM_SHORT is_num_string(); /* isnumstr. c */

/*

'일/이/삼...../구' --> '1/2/3/..../9'

Return value: 0 or '1/2/3/.../9'

*/

HAM_UCHAR conv_numeral_1to9(p)

HAM_PUCHAR p;

{

SYLLABLE syl;

syl = ((*p << 8) & 0xff00) | (*(p+1) & 0xff);

if (syl == 0xC0CF) return '1'

else if(syl ==0xC0CC) return '2';

else if(syl ==0xBBEF) return '3';

else if(syl ==0xBBE7) return '4';

else if(syl ==0xBFC0) return '5';

else if(syl ==0xC0B0) return '6';

else if(syl ==0xC4A5) return '7';

else if(syl ==0xC6C8) return '8';

else if(syl ==0xB1B8) return '9';

else return 0;

}

/*

10단위 수사 음절 (' 십/백/천/만/억/조')인지를 판단

Return value: 0(true) or 1(false)

*/

HAM_SHORT is_numeral_10unit(p)

HAM_PUCHAR p; /* starting position */

{

SYLLABLE syl;

syl = ((*p << 8) & 0xff00) │ (*(p+1) & 0xff);

if (syl == 0xBDCA) return 1; /* '십' */

else if (syl ==0xB9E9) return 1; /* '백' */

else if (syl ==0xC3B5) return 1; /* '천' */

else if (syl ==0xB8B8) return 1; /* '만' */

else if (syl ==0xBEEF) return 1; /* '억' */

else if (syl ==0xC1B6) return 1; /* '조' */

else return 0;

}

/*

이웃한 두 어절이 하나의 numeral이 되는지 검사

앞어절 끝음절이 '십/백/천/만/억/조'인 경우에만.

*/

HAM_PUCHAR is_twoword_numeral(pb, pe)

HAM_PUCHAR pb, pe; /* 1st word의 시작/끝 */

{

HAM_PUCHAR q = pb, p2;

HAM_UCHAR temp[99], *pt=temp;

if (*pe && is_numeral_10unit(pe-2)) {

while (q < pe) *pt++ = *q++ /* copy 1st word */

while (*q == ' ') q++; /* skip blanks */

p2 - q; /* 2nd word */

while (*q && !isspace(*q) && !ispunct (*q))

*pt++ = *q++; /* append 2nd word */

*pt = '\0';

if (*p2 && is_num_string(p2, 1) &&

is_num_string(temp, 1)) return q;

}

return NULL;

}

/*

input sentence에서 띄어쓴 수사들을 붙여쓰기.

예: "천 3백 5십원" ---> "천3백5십원"

void adjust_numerals(sent)

HAM_PUCHAR sent; /* KSC5601 input sentence */

{

HAM_PUCHAR p = sent, pb, pe r;

while (*p) {

while (*p && isspace(*p)) p++; /* skip space char */

pb = p; /* word begins here */

while (*p && !isspace(*p)) p++;

pe = p; /* word-ending position */

if (r = is_twoword_numeral(pb, pe)) {

while (pe < r) { *pe = *(pe+1); pe++; }

*pe = ' ' ; /* blank feeding */

p = pb;

} else p = pe;

}

}

/*

Leading numbers and numerals are converted into Arabic numbers.

Rest Hangul characters are added at the end.

Number types

1: all digits : 23500000원

2: all digits with comma : 23,500,000원

3: all Hangul : 이천삽백오십만원

4: digit, Hangul, comma are scrambled

2천3백5십만원, 2천3백50만원, 2천350만원, 2,350만원

All number types are converted to one of 2 types

Type-1: all digits

Type-2: 10x-unit is Hangul & numbers are '1/2/.../9'.

Return value:

0: no numbers or numerals are found.

MARK_123_NUM1: all number or numeral string, e.g. 2백5십

MARK_123_NUM2: number or numeral prefix, e.g. 2백5십만원

*/

HAM_UCHAR numeral2number(p, q)

HAM_PUCHAR p, q; /* KSC5601 Hangul code */

{

HAM_UCHAR ch =0;

HAM_PUCHAR r =p;

HAM_SHORT moreflag = 0;

while (*p) {

if (*p & 0x80) {

if (ch = conv_numeral_1to9(p)) { /* '일/이/삼/.../구' */

*r++ = ch; /* one of '1/2/.../9' */

p +=2;

} else if (is_numeral_10unit(p)) { /* '십/백/천/만/억/조' */

*r++ = *p++;

*r++ = *p++;

moreflag = 1; /* need 10-unit processing */

} else break; /* numeral ended */

} else {

if (isdigit(*p))

*r++ = *p;

else if (*p == ',') /* remove ',' */

;

else; /* error? */

p++;

}

}

*r = '\0';

if (*q == '\0') { strcpy (q, p); return 0; }

if (moreflag) conv_numeral_unit(q); /* '십/백/천/만/억/조' */

strcat(q, p); /* concatenate rest substring */

return (*p? MARK_123_NUM2: MARK_123_NUM1);

}

부록-5, 전자거래용 질의어 처리기 Source(일부)

/*

File Name: nlq-ec. c

Description:

Written by: Kang, Seung-Shik 1999.02.11

*/

#include <stdlib, h>

#include "query.h"

extern BOOLEAN is_query_node(); /* is-qnode. c */

extern void set_query_node(); /* setqnode. c */

extern HAM_SHORT is_num_string(); /* Keyword/isnumstr. c */

extern HAM_UCHAR numeral2number();

extern void adjust_numerals(); /* Keyword/numeral. c */

extern KET_PPARES parsing(): /* parse/parse2. c */

extern HAM_PUCHAR malloc_strcpy(); /* parse/parsemem. c */

*/

Generate query list for product names.

*/

QUERY_PLIST make_query_list(node, head)

KET_PHEAD node;

QUERY_PLIST head;

{

HAM_SHORT i;

QUERY_PLIST tail=head;

while (tail && tail->next) tail =tail->next; /* last query node */

if (is_query_node(node)) {

if (head ==NULL) { /* first qlist-node */

head = (QUERY_PLIST) malloc(sizeof(QUERY_LIST));

tail = head;

} else {

tail-> next = (QUERY_PLIST) malloc(sizeof(QUERY_LIST));

tail = tail->next;

}

set_query_node(tail, node);

}

if (node->link) { /* recursion for daughter nodes */

for (i=0; i < node->link->nson; i++)

head = make_query_list(node->link->son[i], head;

}

return head;

}

/*

Hangul+digit numerals --> digit string

*/

void conv_numerals(node)

KET_PHEAD node;

{

HAM_SHORT i;

HAM_UCHAR k, digits[STEMSIZE];

if (node->pr->pos ==HAM_POS_NPXM && /* only for noun */

is_num_string(node->Kstem, 0) && /* numeral string */

(k = numera12number(node-> kstem, digits))) {/*converted O.K */

node-> Kstem = malloc_strcpy(digits);

node->pr->pos2 = (k == MARK_123_NUM1?

HAM_POS_digits: HAM_POS_digitsH);

}

if (node-> link) { /* recursion for daughter nodes */

for (i = 0; i < node->link->nson; i++);

conv_numerals(node->link->son[i];

}

}

/*

Integrate number-numeral words and make a query list.

*/

QUERY_PLIST query_ec(sent, mode, ppr)

HAM_PUCHAR sent;

HAM_PRUNMODE mode;

KET_PPARES *ppr;

{

QUERY_PLIST qlist=NULL;

adjust_numerals(sent); /* 2+word numeral --> 1 word */

*ppr = parsing (sent, mode);

conv_numerals((*ppr)->root); /* numeral --> digit string */

qlist = make_query_list((*ppr)->root, qlist);

return qlist;

}

부록-6. 수사 어절의 유형 예

2350000원

2,350,000원

2,350만원

235만원

2백35만원

2백3십5만원

이백삼십오만원

2백 35만원

2백 3십5만원

2백3십 5만원

2백 3십 5만원

이백 삼십오만원

이백삼십오 만원

이백 삼십 오만원

2백 삼십오만원

2백 3십오만원

2백삼십 5만원

2백 삼십 5만원

이백 삼십5만원

이백3십오 만원

이백 3십 5만원

부록-7. 전자거래용 질의어 문장 예

1백만원대 TV를 사고 싶어요.

백만원대 TV를 사고 싶어요.

1백 이십만원대 TV를 사고 싶어요.

1백만원 정도의 TV를 사고 싶어요.

백오십만원대 TV를 사고 싶어요.

3백 오십만원대 TV를 사고 싶어요.

1000000원 이상의 TV를 사고 싶어요.

1000000원 이하의 TV를 사고 싶어요.

1000000원을 초과하는 TV를 사고 싶어요.

1000000원 미만의 TV를 사고 싶어요.

90만원에서 100만원 사이의 테레비를 사고 싶어요.

1000000원부터 1500000원까지의 테레비를 사고 싶어요.

최고 1000000원의 TV를 사고 싶어요.

최소 1000000원의 TV를 사고 싶어요.

100만원 이상 150만원 이하의 TV를 보여 주세요.

100만 이상 150만원 미만의 TV는?

백오십만원짜리 tv를 구입하여 합니다.

최소한 백2십만원보다 비싸고 2백만원보다는 싼 TV를 사고 싶어요.

최대 5만원짜리 TV와 최소한 3만원 이상의 냉장고를 사고 싶다.

최대 5만원짜리 TV와 최소 3만원 냉장고를 사고 싶다.

제일 비싼 테레비를 사고 싶어요.

TV의 최고 가격을 알고 싶어요.

TV의 최소 가격을 알고 싶어요.

부록-8 질의어 처리기 실행 예

query: 1백만원대 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

1000000원대[N] 1백만원대/N

PROD = [TV] : 1000000 ~ 1999999

query: 1백만원대 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

1000000원대[N] 백만원대/N

PROD = [TV] : 1000000 ~ 1999999

query: 1백이십만원대 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

1200000원대[N] 1백만원대/N

PROD = [TV] : 1200000 ~ 1299999

query: 1백만원 정도 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

정도[G] 정도/N 의/j

1000000원대[N] 1백만원대/N

PROD = [TV] : 1000000 ~ 1999999

query: 백만오십원대 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

1500000원대[N] 백오십만원대/N

PROD = [TV] : 1500000 ~ 1599999

query: 3백오십만원대 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

3500000원대[N] 3백오십만원대/N

PROD = [TV] : 3500000 ~ 3599999

query: 1000000원 이상의 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

이상[G] 이상/N 의/j

1000000원대[N] 1000000원대/N

PROD = [TV] : 1000000 ~ 999999999

query: 1000000원 이하의 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

이하[G] 이하/N 의/j

1000000원[N] 1000000원/N

PROD = [TV] : 0 ~ 1000000

query: 1000000원 초과하는 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

초과[K] 초과/N 하/t 는/e

1000000원[O] 1000000원/N 을/j

PROD = [TV] : 1000001 ~ 999999999

query: 1000000원 미만의 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

미만[G] 미만/N 의/j

1000000원[N] 1000000원/N

PROD = [TV] : 0 ~ 999999

query: 90만원에서 100만원 사이의 테레비를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

테레비[O] 테레비/N 을/j

사이[G] 사이/N 의/j

1000000원[N] 100만원/N

900000[U] 90만원/N 에서/j

PROD = [테레비] : 900001 ~ 999999

query: 1000000원부터 1500000만원까지 테레비를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

테레비[O] 테레비/N 을/j

1500000원[G] 1500000원/N 까지의/j

1000000원[U] 1000000만원/N 부터/j

PROD = [테레비] : 1000000 ~ 1500000

query: 최고 1000000원의 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

1000000[G] 1000000/N 의/j

최고[N] 최고/N

PROD = [TV] : 0 ~ 1000000

query: 최소 1000000원의 TV를 사고 싶어요.

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

1000000[G] 1000000원/N 의/j

최소[N] 최소/N

PROD = [TV] : 1000000 ~ 999999999

query: 100만원 이상150만원 이하의 TV를 보여 주세요.

주[F] 주/V 세요/e

보이[V] 보이/V 어/e

TV[O] TV/N 을/j

이하[G] 이하/N 의/j

1500000원[N] 150만원/N

이상[N] 이상/N

1000000원[N] 100만원/N

PROD = [TV] : 1000000 ~ 1500000

query: 100만원 이상150만원 미만의 TV는?.

TV[U] TV/N 은/j

미만[G] 미만/N 의/j

1500000원[N] 150만원/N

이상[N] 이상/N

1000000[U] 100만/N

PROD = [TV] : 1000000 ~ 1499999

query: 백오십만원짜리 tv를 구입하려 합니다.

하[F] 하/V 습니다/e

구입[V] 구입/N 하/t 으려/e

tv[O] tv/N 을/j

1500000원[N] 백오십만원/N 짜리/s

PROD = [tv] : 1500000 ~ 1500000

query: 최소한 백2십만원보다 비싸고 2백만원보다는 싼 TV를 사고 싶어요..

싶[F] 싶/V 어요/e

사[V] 사/V 고/e

TV[O] TV/N 을/j

싸[K] 싸/V 은/e

2000000원대[U] 2백만원대/N 보다는/j

비싸[V] 비싸/V 고/e

1200000원[U] 백2십만원/N 보다/j

최소한[N] 최소한[N]

PROD = [TV] : 1200000 ~ 2000000

query: 최대 5만원짜리 TV와 최소한 3만원 이상의 냉장고를 사고 싶다.

싶[F] 싶/V 다/e

사[V] 사/V 고/e

냉장고[O] 냉장고/N 을/j

이상[G] 이상/N 은/j

30000원[N] 3만원/N

최소한[N] 최소한N

TV[&] TV/N 과/j

50000원[N] 5만원/N 짜리/s

최대[N] 최대/N

PROD = [냉장고] : 30000 ~ 999999999

PROD = [TV] : 0 ~ 50000

query: 최대 5만원짜리 TV와 최소 3만원 냉장고를 사고 싶다.

싶[F] 싶/V 다/e

사[V] 사/V 고/e

냉장고[O] 냉장고/N 을/j

30000원[N] 3만원/N

최소[N] 최소N

TV[&] TV/N 과/j

50000원[N] 5만원/N 짜리/s

최대[N] 최대/N

PROD = [냉장고] : 30000 ~ 999999999

PROD = [TV] : 0 ~ 50000

[본문링크] 상거래용 형태소 분석기 및 구문분석기 개발 에 관한 연구
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=7324
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.